在it运维过程中,决策层经常会找我们要一些数据,用于制定一些预算,或者他们就是想知道。如果他们问你数据每月增长量是多少?未来一年我们要买多大容量的存储才可以?你能回答出来吗。这个要求有三个办法可以满足,笨办法、花钱的办法、不花钱的办法。
笨办法:每月或者每天打开数据库属性,看数据库容量,然后记录在excel或者本上上;
花钱的办法:通过scom监控,参见:http://yejunjian.blog.51cto.com/
下面说的是不花钱的办法,思路是每天自动记录每个数据库的数据容量和日志容量,写入一张表;然后将当日的事务日志容量和数据容量之和分别写入另外两张表。有了这些数据,无论是拿到EXCEL中折腾还是到bi里面折腾都可以。
首先用下面的代码建立三个表,我放在了master库中,无论你放在那里,请写入相应的文档,以免遗忘或者你离职之后为难后面的人。
- CREATE TABLE [dbo].[CountSize]
- (
- [name] [sysname] NOT NULL ,
- [SIZE] [int] NULL ,
- [type] [tinyint] NOT NULL ,
- [type_desc] [nvarchar](60) NULL ,
- [physical_name] [nvarchar](260) NOT NULL ,
- [nowtime] [datetime] NOT NULL
- )
- ON [PRIMARY]
- --建表,合计log容量
- CREATE TABLE TotalLogSize
- (
- TotalLogSize INT ,
- CountDate DATETIME UNIQUE
- ) ;
- go
- --建表,合计数据容量
- CREATE TABLE TotaldataSize
- (
- TotaldataSize INT ,
- CountDate DATETIME UNIQUE
- ) ;
- go
第一个表用于存放每天数据库日志、数据的容量。第二个和第三个数据库用于存放当日的数据库容量之和、日志容量之和。加上UNIQUE 是为了防止重复,也可以不加。
建表完成之后将下面的脚本加入到job里面,每天执行一次:
- USE master
- DECLARE @sql VARCHAR(1000)
- SELECT @sql = 'use [?]; INSERT INTO master.dbo.countsize SELECT name,size*8/1024 AS SIZE,type,type_desc,physical_name,CONVERT(DATETIME, CONVERT(VARCHAR(11), GETDATE(), 112)) as nowtime FROM sys.database_files ;'
- EXEC sp_msforeachdb @sql
- --插入当前合计
- INSERT INTO TotaldataSize
- ( TotaldataSize ,
- CountDate
- )
- SELECT SUM(size) AS TotaldataSize ,
- CONVERT(DATETIME, CONVERT(VARCHAR(11), GETDATE(), 112)) AS CountDate
- FROM dbo.countsize
- WHERE type_desc = 'rows'
- AND nowtime = CONVERT(DATETIME, CONVERT(VARCHAR(11), GETDATE(), 112))
- go
- INSERT INTO TotalLogSize
- ( TotalLogSize ,
- CountDate
- )
- SELECT SUM(size) AS TotalLogSize ,
- CONVERT(DATETIME, CONVERT(VARCHAR(11), GETDATE(), 112)) AS CountDate
- FROM dbo.countsize
- WHERE type_desc = 'log'
- AND nowtime = CONVERT(DATETIME, CONVERT(VARCHAR(11), GETDATE(), 112))
- go
以后查询只用访问全面建立的三个表的内容即可。