-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathDisk Space Monitoring.sql
More file actions
235 lines (202 loc) · 7.99 KB
/
Disk Space Monitoring.sql
File metadata and controls
235 lines (202 loc) · 7.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
--==============================================--
/*** 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