查看数据大小和日志文件大小

 

利用以下存储过程可以查看数据文件和日志文件的使用情况。每天运行下,进而掌握数据文件和日志文件的变化

  1 USE master;
  2 GO 
  3  
  4 IF OBJECT_ID('dbo.sp_SDS', 'P') IS NOT NULL
  5   DROP PROCEDURE dbo.sp_SDS;
  6 GO 
  7  
  8 CREATE PROCEDURE dbo.sp_SDS
  9   @TargetDatabase nvarchar(128) = NULL,  --  NULL: all dbs
 10   @Level varchar(10) = 'Database',       --  or "File"
 11   @UpdateUsage bit = 0,                  --  default no update
 12   @Unit char(2) = 'MB'                   --  Megabytes, Kilobytes or Gigabytes
 13 AS
 14  
 15 /**************************************************************************************************
 16 **
 17 **  author: Richard Ding
 18 **  date:   4/8/2008
 19 **  usage:  list db size AND path w/o SUMmary
 20 **  test code: sp_SDS   --  default behavior
 21 **             sp_SDS 'maAster'
 22 **             sp_SDS NULL, NULL, 0
 23 **             sp_SDS NULL, 'file', 1, 'GB'
 24 **             sp_SDS 'Test_snapshot', 'Database', 1
 25 **             sp_SDS 'Test', 'File', 0, 'kb'
 26 **             sp_SDS 'pfaids', 'Database', 0, 'gb'
 27 **             sp_SDS 'tempdb', NULL, 1, 'kb'
 28 **
 29 **************************************************************************************************/ 
 30  
 31 SET NOCOUNT ON; 
 32  
 33 IF @TargetDatabase IS NOT NULL AND DB_ID(@TargetDatabase) IS NULL
 34   BEGIN
 35     RAISERROR(15010, -1, -1, @TargetDatabase);
 36     RETURN (-1)
 37   END
 38  
 39 IF OBJECT_ID('tempdb.dbo.##Tbl_CombinedInfo', 'U') IS NOT NULL
 40   DROP TABLE dbo.##Tbl_CombinedInfo; 
 41  
 42 IF OBJECT_ID('tempdb.dbo.##Tbl_DbFileStats', 'U') IS NOT NULL
 43   DROP TABLE dbo.##Tbl_DbFileStats; 
 44  
 45 IF OBJECT_ID('tempdb.dbo.##Tbl_ValidDbs', 'U') IS NOT NULL
 46   DROP TABLE dbo.##Tbl_ValidDbs; 
 47  
 48 IF OBJECT_ID('tempdb.dbo.##Tbl_Logs', 'U') IS NOT NULL
 49   DROP TABLE dbo.##Tbl_Logs; 
 50  
 51 CREATE TABLE dbo.##Tbl_CombinedInfo (
 52   DatabaseName sysname NULL,
 53   [type] VARCHAR(10) NULL,
 54   LogicalName sysname NULL,
 55   T dec(10, 2) NULL,
 56   U dec(10, 2) NULL,
 57   [U(%)] dec(5, 2) NULL,
 58   F dec(10, 2) NULL,
 59   [F(%)] dec(5, 2) NULL,
 60   PhysicalName sysname NULL ); 
 61  
 62 CREATE TABLE dbo.##Tbl_DbFileStats (
 63   Id int identity,
 64   DatabaseName sysname NULL,
 65   FileId int NULL,
 66   FileGroup int NULL,
 67   TotalExtents bigint NULL,
 68   UsedExtents bigint NULL,
 69   Name sysname NULL,
 70   FileName varchar(255) NULL ); 
 71  
 72 CREATE TABLE dbo.##Tbl_ValidDbs (
 73   Id int identity,
 74   Dbname sysname NULL ); 
 75  
 76 CREATE TABLE dbo.##Tbl_Logs (
 77   DatabaseName sysname NULL,
 78   LogSize dec (10, 2) NULL,
 79   LogSpaceUsedPercent dec (5, 2) NULL,
 80   Status int NULL ); 
 81  
 82 DECLARE @Ver varchar(20),
 83         @DatabaseName sysname,
 84         @Ident_last int,
 85         @String varchar(2000),
 86         @BaseString varchar(2000); 
 87  
 88 SELECT @DatabaseName = '',
 89        @Ident_last = 0,
 90        @String = '',
 91        @Ver = CASE WHEN @@VERSION LIKE '%9.0%' THEN 'SQL 2005'
 92                    WHEN @@VERSION LIKE '%8.0%' THEN 'SQL 2000'
 93                    WHEN @@VERSION LIKE '%10.0%' THEN 'SQL 2008'
 94                    WHEN @@VERSION LIKE '%10.5%' THEN 'SQL 2008 R2'
 95               END; 
 96  
 97 SELECT @BaseString =
 98 ' SELECT DB_NAME(), ' +
 99 CASE WHEN @Ver = 'SQL 2000' THEN 'CASE WHEN status & 0x40 = 0x40 THEN ''Log''  ELSE ''Data'' END'
100   ELSE ' CASE type WHEN 0 THEN ''Data'' WHEN 1 THEN ''Log'' WHEN 4 THEN ''Full-text'' ELSE ''reserved'' END' END +
101 ', name, ' +
102 CASE WHEN @Ver = 'SQL 2000' THEN 'filename' ELSE 'physical_name' END +
103 ', size*8.0/1024.0 FROM ' +
104 CASE WHEN @Ver = 'SQL 2000' THEN 'sysfiles' ELSE 'sys.database_files' END +
105 ' WHERE '
106 + CASE WHEN @Ver = 'SQL 2000' THEN ' HAS_DBACCESS(DB_NAME()) = 1' ELSE 'state_desc = ''ONLINE''' END + ''; 
107  
108 SELECT @String = 'INSERT INTO dbo.##Tbl_ValidDbs SELECT name FROM ' +
109                  CASE WHEN @Ver = 'SQL 2000' THEN 'master.dbo.sysdatabases'
110                       WHEN @Ver IN ('SQL 2005', 'SQL 2008', 'SQL 2008 R2') THEN 'master.sys.databases'
111                  END + ' WHERE HAS_DBACCESS(name) = 1 ORDER BY name ASC';
112 EXEC (@String); 
113  
114 INSERT INTO dbo.##Tbl_Logs EXEC ('DBCC SQLPERF (LOGSPACE) WITH NO_INFOMSGS'); 
115  
116 --  For data part
117 IF @TargetDatabase IS NOT NULL
118   BEGIN
119     SELECT @DatabaseName = @TargetDatabase;
120     IF @UpdateUsage <> 0 AND DATABASEPROPERTYEX (@DatabaseName,'Status') = 'ONLINE'
121           AND DATABASEPROPERTYEX (@DatabaseName, 'Updateability') <> 'READ_ONLY'
122       BEGIN
123         SELECT @String = 'USE [' + @DatabaseName + '] DBCC UPDATEUSAGE (0)';
124         PRINT '*** ' + @String + ' *** ';
125         EXEC (@String);
126         PRINT '';
127       END
128  
129     SELECT @String = 'INSERT INTO dbo.##Tbl_CombinedInfo (DatabaseName, type, LogicalName, PhysicalName, T) ' + @BaseString;  
130  
131     INSERT INTO dbo.##Tbl_DbFileStats (FileId, FileGroup, TotalExtents, UsedExtents, Name, FileName)
132           EXEC ('USE [' + @DatabaseName + '] DBCC SHOWFILESTATS WITH NO_INFOMSGS');
133     EXEC ('USE [' + @DatabaseName + '] ' + @String); 
134  
135     UPDATE dbo.##Tbl_DbFileStats SET DatabaseName = @DatabaseName;
136   END
137 ELSE
138   BEGIN
139     WHILE 1 = 1
140       BEGIN
141         SELECT TOP 1 @DatabaseName = Dbname FROM dbo.##Tbl_ValidDbs WHERE Dbname > @DatabaseName ORDER BY Dbname ASC;
142         IF @@ROWCOUNT = 0
143           BREAK;
144         IF @UpdateUsage <> 0 AND DATABASEPROPERTYEX (@DatabaseName, 'Status') = 'ONLINE'
145               AND DATABASEPROPERTYEX (@DatabaseName, 'Updateability') <> 'READ_ONLY'
146           BEGIN
147             SELECT @String = 'DBCC UPDATEUSAGE (''' + @DatabaseName + ''') ';
148             PRINT '*** ' + @String + '*** ';
149             EXEC (@String);
150             PRINT '';
151           END
152  
153         SELECT @Ident_last = ISNULL(MAX(Id), 0) FROM dbo.##Tbl_DbFileStats; 
154  
155         SELECT @String = 'INSERT INTO dbo.##Tbl_CombinedInfo (DatabaseName, type, LogicalName, PhysicalName, T) ' + @BaseString;  
156  
157         EXEC ('USE [' + @DatabaseName + '] ' + @String); 
158  
159         INSERT INTO dbo.##Tbl_DbFileStats (FileId, FileGroup, TotalExtents, UsedExtents, Name, FileName)
160           EXEC ('USE [' + @DatabaseName + '] DBCC SHOWFILESTATS WITH NO_INFOMSGS'); 
161  
162         UPDATE dbo.##Tbl_DbFileStats SET DatabaseName = @DatabaseName WHERE Id BETWEEN @Ident_last + 1 AND @@IDENTITY;
163       END
164   END
165  
166 --  set used size for data files, do not change total obtained from sys.database_files as it has for log files
167 UPDATE dbo.##Tbl_CombinedInfo
168 SET U = s.UsedExtents*8*8/1024.0
169 FROM dbo.##Tbl_CombinedInfo t JOIN dbo.##Tbl_DbFileStats s
170 ON t.LogicalName = s.Name AND s.DatabaseName = t.DatabaseName; 
171  
172 --  set used size and % values for log files:
173 UPDATE dbo.##Tbl_CombinedInfo
174 SET [U(%)] = LogSpaceUsedPercent,
175 U = T * LogSpaceUsedPercent/100.0
176 FROM dbo.##Tbl_CombinedInfo t JOIN dbo.##Tbl_Logs l
177 ON l.DatabaseName = t.DatabaseName
178 WHERE t.type = 'Log'; 
179  
180 UPDATE dbo.##Tbl_CombinedInfo SET F = T - U, [U(%)] = U*100.0/T; 
181  
182 UPDATE dbo.##Tbl_CombinedInfo SET [F(%)] = F*100.0/T; 
183  
184 IF UPPER(ISNULL(@Level, 'DATABASE')) = 'FILE'
185   BEGIN
186     IF @Unit = 'KB'
187       UPDATE dbo.##Tbl_CombinedInfo
188       SET T = T * 1024, U = U * 1024, F = F * 1024; 
189  
190     IF @Unit = 'GB'
191       UPDATE dbo.##Tbl_CombinedInfo
192       SET T = T / 1024, U = U / 1024, F = F / 1024; 
193  
194     SELECT DatabaseName AS 'Database',
195       type AS 'Type',
196       LogicalName,
197       T AS 'Total',
198       U AS 'Used',
199       [U(%)] AS 'Used (%)',
200       F AS 'Free',
201       [F(%)] AS 'Free (%)',
202       PhysicalName
203       FROM dbo.##Tbl_CombinedInfo
204       WHERE DatabaseName LIKE ISNULL(@TargetDatabase, '%')
205       ORDER BY DatabaseName ASC, type ASC; 
206  
207     SELECT CASE WHEN @Unit = 'GB' THEN 'GB' WHEN @Unit = 'KB' THEN 'KB' ELSE 'MB' END AS 'SUM',
208         SUM (T) AS 'TOTAL', SUM (U) AS 'USED', SUM (F) AS 'FREE' FROM dbo.##Tbl_CombinedInfo;
209   END
210  
211 IF UPPER(ISNULL(@Level, 'DATABASE')) = 'DATABASE'
212   BEGIN
213     DECLARE @Tbl_Final TABLE (
214       DatabaseName sysname NULL,
215       TOTAL dec (10, 2),
216       [=] char(1),
217       used dec (10, 2),
218       [used (%)] dec (5, 2),
219       [+] char(1),
220       free dec (10, 2),
221       [free (%)] dec (5, 2),
222       [==] char(2),
223       Data dec (10, 2),
224       Data_Used dec (10, 2),
225       [Data_Used (%)] dec (5, 2),
226       Data_Free dec (10, 2),
227       [Data_Free (%)] dec (5, 2),
228       [++] char(2),
229       Log dec (10, 2),
230       Log_Used dec (10, 2),
231       [Log_Used (%)] dec (5, 2),
232       Log_Free dec (10, 2),
233       [Log_Free (%)] dec (5, 2) ); 
234  
235     INSERT INTO @Tbl_Final
236       SELECT x.DatabaseName,
237            x.Data + y.Log AS 'TOTAL',
238            '=' AS '=',
239            x.Data_Used + y.Log_Used AS 'U',
240            (x.Data_Used + y.Log_Used)*100.0 / (x.Data + y.Log)  AS 'U(%)',
241            '+' AS '+',
242            x.Data_Free + y.Log_Free AS 'F',
243            (x.Data_Free + y.Log_Free)*100.0 / (x.Data + y.Log)  AS 'F(%)',
244            '==' AS '==',
245            x.Data,
246            x.Data_Used,
247            x.Data_Used*100/x.Data AS 'D_U(%)',
248            x.Data_Free,
249            x.Data_Free*100/x.Data AS 'D_F(%)',
250            '++' AS '++',
251            y.Log,
252            y.Log_Used,
253            y.Log_Used*100/y.Log AS 'L_U(%)',
254            y.Log_Free,
255            y.Log_Free*100/y.Log AS 'L_F(%)'
256       FROM
257       ( SELECT d.DatabaseName,
258                SUM(d.T) AS 'Data',
259                SUM(d.U) AS 'Data_Used',
260                SUM(d.F) AS 'Data_Free'
261           FROM dbo.##Tbl_CombinedInfo d WHERE d.type = 'Data' GROUP BY d.DatabaseName ) AS x
262       JOIN
263       ( SELECT l.DatabaseName,
264                SUM(l.T) AS 'Log',
265                SUM(l.U) AS 'Log_Used',
266                SUM(l.F) AS 'Log_Free'
267           FROM dbo.##Tbl_CombinedInfo l WHERE l.type = 'Log' GROUP BY l.DatabaseName ) AS y
268       ON x.DatabaseName = y.DatabaseName; 
269  
270     IF @Unit = 'KB'
271       UPDATE @Tbl_Final SET TOTAL = TOTAL * 1024,
272       used = used * 1024,
273       free = free * 1024,
274       Data = Data * 1024,
275       Data_Used = Data_Used * 1024,
276       Data_Free = Data_Free * 1024,
277       Log = Log * 1024,
278       Log_Used = Log_Used * 1024,
279       Log_Free = Log_Free * 1024; 
280  
281      IF @Unit = 'GB'
282       UPDATE @Tbl_Final SET TOTAL = TOTAL / 1024,
283       used = used / 1024,
284       free = free / 1024,
285       Data = Data / 1024,
286       Data_Used = Data_Used / 1024,
287       Data_Free = Data_Free / 1024,
288       Log = Log / 1024,
289       Log_Used = Log_Used / 1024,
290       Log_Free = Log_Free / 1024; 
291  
292       DECLARE @GrantTotal dec(11, 2);
293       SELECT @GrantTotal = SUM(TOTAL) FROM @Tbl_Final; 
294  
295       SELECT
296       CONVERT(dec(10, 2), TOTAL*100.0/@GrantTotal) AS 'WEIGHT (%)',
297       DatabaseName AS 'DATABASE',
298       CONVERT(VARCHAR(12), used) + '  (' + CONVERT(VARCHAR(12), [used (%)]) + ' %)' AS 'USED  (%)',
299       [+],
300       CONVERT(VARCHAR(12), free) + '  (' + CONVERT(VARCHAR(12), [free (%)]) + ' %)' AS 'FREE  (%)',
301       [=],
302       TOTAL,
303       [=],
304       CONVERT(VARCHAR(12), Data) + '  (' + CONVERT(VARCHAR(12), Data_Used) + ',  ' +
305       CONVERT(VARCHAR(12), [Data_Used (%)]) + '%)' AS 'DATA  (used,  %)',
306       [+],
307       CONVERT(VARCHAR(12), Log) + '  (' + CONVERT(VARCHAR(12), Log_Used) + ',  ' +
308       CONVERT(VARCHAR(12), [Log_Used (%)]) + '%)' AS 'LOG  (used,  %)'
309         FROM @Tbl_Final
310         WHERE DatabaseName LIKE ISNULL(@TargetDatabase, '%')
311         ORDER BY DatabaseName ASC; 
312  
313     IF @TargetDatabase IS NULL
314       SELECT CASE WHEN @Unit = 'GB' THEN 'GB' WHEN @Unit = 'KB' THEN 'KB' ELSE 'MB' END AS 'SUM',
315       SUM (used) AS 'USED',
316       SUM (free) AS 'FREE',
317       SUM (TOTAL) AS 'TOTAL',
318       SUM (Data) AS 'DATA',
319       SUM (Log) AS 'LOG'
320       FROM @Tbl_Final;
321   END
322  
323 RETURN (0) 
324  
325 GO

 

执行存储过程exec dbo.sp_SDS

 参考文章:http://www.jppinto.com/2011/12/sp_sds-stored-procedure-updated-to-work-with-sql-server-2008-r2/

posted @ 2013-09-12 10:39  yingtaowz  阅读(871)  评论(0编辑  收藏  举报