Koliko još ima prostora na diskovima?

Pitanje koliko još ima prostora na diskovima je verovatno najčešće pitanje koje sebi postavljaju administratori SQL Server-a (vrlo često sa strepnjom) što zbog svakodnevnog održavanja što što zbog toga što treba da se kreira nova baza.

Odgovor na to pitanje može da znači potrebu da se neka baza migrira na drugi disk ili da treba da se razmišlja recimo o komprimovanju. Šta god bio povod za postavljanje pitanja o preostalom slobodnom prostoru na diskovima, odgovor može da se dobije na više načina.

Najjednostavniji način za dobijanje odgovora o tome koliko je još preostalo slobodnog prostora na diskovima je korišćenje  SQL Server stored procedure (Primer 1):

exec master.sys.xp_fixeddrives

Primer 1. Korišćenje stored procedure xp_fixeddrives

Izvršavanjem TSQL koda iz primera 1 se dobija:

b2001

Slika 1. Rezultat izvršavanja stored procedure xp_fixeddrives

Naravno, da bi mogla da se izvrši ova stored procedura potrebne su adekvatne privilegije na master bazi.

Drugi način je korišćenje FSUTIL alata operativnog sistema. Za njegovo korišćenje su potrebne administrativne privilegije na nivou operativnog sistema a takođe je potrebno uključiti xp_cmdshell na nivou SQL Server-a. U primeru 2 je dat TSQL kod za korišćenje FSUTIL alata.

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE;
GO
--------------------------------------------

DECLARE	@Drive TINYINT,
	@SQL VARCHAR(100)

SET	@Drive = 97

-- Setup Staging Area
DECLARE	@Drives TABLE
	(
		Drive CHAR(1),
		Info VARCHAR(80)
	)

WHILE @Drive <= 122
	BEGIN
		SET	@SQL = 'EXEC XP_CMDSHELL ''fsutil volume diskfree ' + CHAR(@Drive) + ':'''

		INSERT	@Drives
			(
				Info
			)
		EXEC	(@SQL)

		UPDATE	@Drives
		SET	Drive = CHAR(@Drive)
		WHERE	Drive IS NULL

		SET	@Drive = @Drive + 1
	END

-- Show the expected output
SELECT		Drive,
		SUM(CASE WHEN Info LIKE 'Total # of bytes             : %' THEN CAST(REPLACE(SUBSTRING(Info, 32, 48), CHAR(13), '') AS BIGINT) ELSE CAST(0 AS BIGINT) END) AS TotalBytes,
		SUM(CASE WHEN Info LIKE 'Total # of free bytes        : %' THEN CAST(REPLACE(SUBSTRING(Info, 32, 48), CHAR(13), '') AS BIGINT) ELSE CAST(0 AS BIGINT) END) AS FreeBytes,
		SUM(CASE WHEN Info LIKE 'Total # of avail free bytes  : %' THEN CAST(REPLACE(SUBSTRING(Info, 32, 48), CHAR(13), '') AS BIGINT) ELSE CAST(0 AS BIGINT) END) AS AvailFreeBytes
FROM		(
			SELECT	Drive,
				Info
			FROM	@Drives
			WHERE	Info LIKE 'Total # of %'
		) AS d
GROUP BY	Drive
ORDER BY	Drive

GO
-------------------------------------------

EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

Primer 2. Korišćenje FSUTIL-a

Izvršavanje ovog TSQL koda dobija se rezultat koji je dat na slici 2.

b2002

Slika 2. Rezultat korišćenja FSUTIL-a

Treći način za dobijanje odgovora o tome koliko je još preostalo slobodnog prostora na diskovima je korišćenje powershell-a (Primer 3). Za korišćenje powershell-a su neophodne adekvatne privilegije.

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE;
GO

-------------------------------------------------------------

declare @svrName varchar(255)
declare @sql varchar(400)
--by default it will take the current server name, we can the set the server name as well
set @svrName = CONVERT(VARCHAR(128),SERVERPROPERTY('machinename') )-- @@SERVERNAME
set @sql = 'powershell.exe -c "Get-WmiObject -ComputerName ' + QUOTENAME(@svrName,'''') + ' -Class Win32_Volume -Filter ''DriveType = 3'' | select name,capacity,freespace | foreach{$_.name+''|''+$_.capacity/1048576+''%''+$_.freespace/1048576+''*''}"'
--creating a temporary table
CREATE TABLE #output
(line varchar(255))
--inserting disk name, total space and free space value in to temporary table
insert #output
EXEC xp_cmdshell @sql
--script to retrieve the values in GB from PS Script output
select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
from #output
where line like '[A-Z][:]%'
order by drivename
--script to drop the temporary table
drop table #output

-------------------------------------------

EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

Primer 3. Korišćenje powershell-a

Korišćenjem TSQL koda iz primera 3 dobija se rezultat koji je dat na slici 3.

b2003

Slika 3. Rezultat korišćenja powershell-a

Leave a Reply

%d bloggers like this: