--==============================================-- /*** SQL SERVER Disk Space Monitoring QUERIES ***/ --==============================================-- -- Supported Versions SQL server 2008 and higher ------------------------------------------------- ---------------------------------------------- /*** 1. Get all Disks Total and Free Size ***/ ---------------------------------------------- DECLARE @MOUNTVOL TABLE ( MOUNTVOLResult nVARCHAR(500) ,ExecCommand nVARCHAR(500)) INSERT INTO @MOUNTVOL (MOUNTVOLResult) EXEC XP_CMDSHELL 'MOUNTVOL' DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%VOLUME%' DELETE @MOUNTVOL WHERE MOUNTVOLResult IS NULL DELETE @MOUNTVOL WHERE MOUNTVOLResult NOT LIKE '%:%' DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%MOUNTVOL%' DELETE @MOUNTVOL WHERE MOUNTVOLResult LIKE '%RECYCLE%' UPDATE @MOUNTVOL SET ExecCommand = 'EXEC XP_CMDSHELL ''FSUTIL VOLUME DISKFREE ' + LTRIM(RTRIM(MOUNTVOLResult)) +'''' DECLARE @DRIVESpace TABLE ( DriveLetter VARCHAR(10) ,DriveInfo VARCHAR(100)) WHILE (SELECT COUNT(*) FROM @MOUNTVOL) <>0 BEGIN DECLARE @Command nVARCHAR(500), @DriveLetter nVARCHAR(10) Select @Command = ExecCommand, @DriveLetter= MOUNTVOLResult from @MOUNTVOL INSERT INTO @DRIVESpace (DriveInfo) Exec sp_executeSQL @Command UPDATE @DRIVESpace SET DriveLetter=@DriveLetter WHERE DriveLetter IS NULL DELETE FROM @MOUNTVOL WHERE ExecCommand=@Command END DECLARE @FinalResults TABLE ( DriveLetter nVARCHAR(10) ,[TotalDriveSpace(MB)] DECIMAL(18,2) ,[UsedSpaceOnDrive(MB)] AS ([TotalDriveSpace(MB)] - [FreeSpaceOnDrive(MB)]) ,[FreeSpaceOnDrive(MB)] DECIMAL(18,2) ,[TotalDriveSpace(GB)] AS CAST(([TotalDriveSpace(MB)]/1024) AS DECIMAL(18,2)) ,[UsedSpaceOnDrive(GB)] AS CAST((([TotalDriveSpace(MB)] - [FreeSpaceOnDrive(MB)])/1024) AS DECIMAL(18,2)) ,[FreeSpaceOnDrive(GB)] AS CAST(([FreeSpaceOnDrive(MB)]/1024) AS DECIMAL(18,2)) ,[%FreeSpace] AS CAST((([FreeSpaceOnDrive(MB)]/[TotalDriveSpace(MB)])*100) AS DECIMAL(18,2))) INSERT INTO @FinalResults (DriveLetter, [TotalDriveSpace(MB)],[FreeSpaceOnDrive(MB)]) SELECT RTRIM(LTRIM(DriveLetter)) ,[TotalDriveSpace(MB)] = SUM(CASE WHEN DriveInfo LIKE 'TOTAL # OF BYTES%' THEN CAST(SUBSTRING(DriveInfo, 32, 48) AS FLOAT) ELSE CAST(0 AS FLOAT) END)/1024/1024 ,[FreeSpaceOnDrive(MB)] = SUM(CASE WHEN DriveInfo LIKE 'TOTAL # OF FREE BYTES%' THEN CAST(SUBSTRING(DriveInfo, 32, 48) AS FLOAT) ELSE CAST(0 AS FLOAT) END)/1024/1024 FROM @DRIVESpace WHERE DriveInfo LIKE 'TOTAL # OF %' GROUP BY DriveLetter ORDER BY DriveLetter SELECT DriveLetter, [TotalDriveSpace(GB)], [TotalDriveSpace(GB)], [%FreeSpace] FROM @FinalResults ------------------------------------------------- /*** 2. Get databases physical file location ***/ ------------------------------------------------- SELECT DISTINCT Db_name(dovs.database_id) [Database Name], mf.physical_name [Physical File Location], dovs.logical_volume_name AS [Logical Name], dovs.volume_mount_point AS Drive, CONVERT(INT, dovs.available_bytes / 1048576.0 / 1024) AS [Free Space (GB)] FROM sys.master_files mf CROSS apply sys.Dm_os_volume_stats(mf.database_id, mf.file_id) dovs ORDER BY [free space (gb)] ASC ---------------------------------------------- /*** 3. List all Databases and its file size ***/ ---------------------------------------------- --Data file size DECLARE @dbsize TABLE ( Dbname sysname, dbstatus varchar(50), Recovery_Model varchar(40) DEFAULT ('NA'), file_Size_MB decimal(30, 2) DEFAULT (0), Space_Used_MB decimal(30, 2) DEFAULT (0), Free_Space_MB decimal(30, 2) DEFAULT (0) ) INSERT INTO @dbsize (Dbname, dbstatus, Recovery_Model, file_Size_MB, Space_Used_MB, Free_Space_MB) EXEC sp_msforeachdb 'use [?]; select DB_NAME() AS DbName, CONVERT(varchar(20),DatabasePropertyEx(''?'',''Status'')) , CONVERT(varchar(20),DatabasePropertyEx(''?'',''Recovery'')), sum(size)/128.0 AS File_Size_MB, sum(CAST(FILEPROPERTY(name, ''SpaceUsed'') AS INT))/128.0 as Space_Used_MB, SUM( size)/128.0 - sum(CAST(FILEPROPERTY(name,''SpaceUsed'') AS INT))/128.0 AS Free_Space_MB from sys.database_files where type=0 group by type' -- log file size DECLARE @logsize TABLE ( Dbname sysname, Log_File_Size_MB decimal(38, 2) DEFAULT (0), log_Space_Used_MB decimal(30, 2) DEFAULT (0), log_Free_Space_MB decimal(30, 2) DEFAULT (0) ) INSERT INTO @logsize (Dbname, Log_File_Size_MB, log_Space_Used_MB, log_Free_Space_MB) EXEC sp_msforeachdb 'use [?]; select DB_NAME() AS DbName, sum(size)/128.0 AS Log_File_Size_MB, sum(CAST(FILEPROPERTY(name, ''SpaceUsed'') AS INT))/128.0 as log_Space_Used_MB, SUM( size)/128.0 - sum(CAST(FILEPROPERTY(name,''SpaceUsed'') AS INT))/128.0 AS log_Free_Space_MB from sys.database_files where type=1 group by type' -- database free size DECLARE @dbfreesize TABLE ( name sysname, database_size varchar(50), Freespace varchar(50) DEFAULT (0.00) ) INSERT INTO @dbfreesize (name, database_size, Freespace) EXEC sp_msforeachdb 'use [?];SELECT database_name = db_name() ,database_size = ltrim(str((convert(DECIMAL(15, 2), dbsize) + convert(DECIMAL(15, 2), logsize)) * 8192 / 1048576, 15, 2) + ''MB'') ,''unallocated space'' = ltrim(str(( CASE WHEN dbsize >= reservedpages THEN (convert(DECIMAL(15, 2), dbsize) - convert(DECIMAL(15, 2), reservedpages)) * 8192 / 1048576 ELSE 0 END ), 15, 2) + '' MB'') FROM ( SELECT dbsize = sum(convert(BIGINT, CASE WHEN type = 0 THEN size ELSE 0 END)) ,logsize = sum(convert(BIGINT, CASE WHEN type <> 0 THEN size ELSE 0 END)) FROM sys.database_files ) AS files ,( SELECT reservedpages = sum(a.total_pages) ,usedpages = sum(a.used_pages) ,pages = sum(CASE WHEN it.internal_type IN ( 202 ,204 ,211 ,212 ,213 ,214 ,215 ,216 ) THEN 0 WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END) FROM sys.partitions p INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT JOIN sys.internal_tables it ON p.object_id = it.object_id ) AS partitions' DECLARE @alldbstate TABLE ( dbname sysname, DBstatus varchar(55), R_model varchar(30) ) --select * from sys.master_files INSERT INTO @alldbstate (dbname, DBstatus, R_model) SELECT name, CONVERT(varchar(20), DATABASEPROPERTYEX(name, 'status')), recovery_model_desc FROM sys.databases --select * from @dbsize INSERT INTO @dbsize (Dbname, dbstatus, Recovery_Model) SELECT dbname, dbstatus, R_model FROM @alldbstate WHERE DBstatus <> 'online' INSERT INTO @logsize (Dbname) SELECT dbname FROM @alldbstate WHERE DBstatus <> 'online' INSERT INTO @dbfreesize (name) SELECT dbname FROM @alldbstate WHERE DBstatus <> 'online' SELECT d.Dbname AS [Database Name], d.dbstatus AS [Status], d.Recovery_Model AS [Recovery Mode], (file_size_mb + log_file_size_mb) AS [Total DB Size], fs.Freespace AS [DB Free Space], d.file_Size_MB AS [MDF Size(MB)], d.Space_Used_MB AS [MDF Used(MB)], d.Free_Space_MB AS [MDF Free(MB)], l.Log_File_Size_MB AS [LDF Size (MB)], log_Space_Used_MB AS [LDF Used (MB)], l.log_Free_Space_MB AS [LDF Free (MB)] FROM @dbsize d JOIN @logsize l ON d.Dbname = l.Dbname JOIN @dbfreesize fs ON d.Dbname = fs.name ORDER BY [Database Name] ASC