MS SQL 监控数据/日志文件增长
USE msdb; GOIF EXISTS (SELECT 1 FROM dbo.sysobjects WHERE id = OBJECT_ID(N'') AND xtype='U')DROP TABLE DiskCapacityHistory; GOCREATE TABLE dbo.DiskCapacityHistory ([Date_CD] INT ,[DataBaseID] INT ,[FileID] INT ,[DataBaseName] sysname ,[LogicalName] VARCHAR(32) ,[FileTypeDesc] NVARCHAR(60) ,[PhysicalName] NVARCHAR(260) ,[StateDesc] NVARCHAR(60) ,[MaxSize] NVARCHAR(32) ,[GrowthType] NVARCHAR(8) ,[IsReadOnly] INT ,[IsPercentGrowth] SMALLINT ,[Size] FLOAT ,[Growth_MOM_RAT] FLOAT ,[Growth_YOY_RAT] FLOAT ,CONSTRAINT PK_DiskCapacityHistory PRIMARY KEY(Date_CD, DataBaseID, FileID) );
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '日期编码', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'Date_CD';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '数据库标识', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'DataBaseID';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件标识', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'FileID';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '数据库名称', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'DataBaseName';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '数据库逻辑名称', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'LogicalName';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件类型描述', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'FileTypeDesc';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '物理数据库文件', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'PhysicalName';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件最大大小', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'MaxSize';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件增长类型', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'GrowthType';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '是否只读类型', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'IsReadOnly';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '是否按百分比增长', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'IsPercentGrowth';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '数据文件大小(GB)', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'Size';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件增长环比(%)', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'Growth_MOM_RAT';EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = '文件增长同比(%)', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'DiskCapacityHistory', @level2type = N'COLUMN', @level2name = N'Growth_YOY_RAT';GOIF OBJECT_ID(N'sp_diskcapacity_cal') IS NOT NULLDROP PROCEDURE sp_diskcapacity_cal; GO
接下来,我们创建存储过程,负责来收集、统计这些数据库的文件的相关信息。关于环比/同比,正常情况一般是:
环比: (指标当前值 - 指标值(上个月同一天))/ 指标值(上个月同一天) 。
同比: (指标当前值 - 指标值(去年月同一天))/ 指标值(去年月同一天) 。
其实如果关注每天的数据文件变化情况,这个代码里面的环比、同比其实意义不大,其实我们可以这样定义环比、同比:
环比: (指标当前值 - 指标值(昨天))/指标值(昨天)。
同比: (指标当前值 - 指标值 (上个月))/指标值(上个月)
当然,你也可以把这四个指标都加上,对比参考,侧重点不同而已。
- IF OBJECT_ID(N'sp_diskcapacity_cal')IS NOT NULL
- DROP PROCEDURE sp_diskcapacity_cal;
- GO
- CREATE PROCEDURE dbo.sp_diskcapacity_cal
- AS
- BEGIN
- INSERT INTO dbo.DiskCapacityHistory
- (
- [Date_CD] ,
- [DataBaseID] ,
- [FileID] ,
- [DataBaseName] ,
- [LogicalName] ,
- [FileTypeDesc] ,
- [PhysicalName] ,
- [StateDesc] ,
- [MaxSize] ,
- [GrowthType] ,
- [IsReadOnly] ,
- [IsPercentGrowth] ,
- [Size]
- )
- SELECT CAST(REPLACE(CONVERT(varchar(10),GETDATE(),120),'-','') AS INT)
- AS DateCD ,
- database_id AS DataBaseId ,
- file_id AS FileID ,
- DB_NAME(database_id) AS DataBaseName ,
- name AS LogicalName ,
- type_desc AS FileTypeDesc ,
- physical_name AS PhysicalName ,
- state_desc AS StateDesc ,
- CASE WHEN max_size = 0 THEN N'不允许增长'
- WHEN max_size = -1 THEN N'自动增长'
- ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2)) + 'G'
- END AS MaxSize ,
- CASE WHEN is_percent_growth = 1
- THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
- ELSE RTRIM(CAST(Growth AS CHAR(10))) + 'M'
- END AS Growth ,
- Is_Read_Only AS IsReadOnly ,
- Is_Percent_Growth AS IsPercentGrowth ,
- CAST(size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) AS Size
- FROM sys.master_files;
- MERGE INTO dbo.DiskCapacityHistory DM USING
- (
- SELECT M.Date_CD ,
- M.DataBaseID ,
- M.FileID ,
- CASE WHEN N.SIZE IS NULL OR N.SIZE = 0 THEN 0 ELSE
- (M.SIZE - N.SIZE)/N.SIZE END AS Growth_MOM_RAT
- FROM dbo.DiskCapacityHistory M
- LEFT JOIN dbo.DiskCapacityHistory N ON
- CAST(CAST(M.Date_CD AS CHAR(8)) AS DATE) = DATEADD(MONTH, 1, CAST(CAST(N.Date_CD AS CHAR(8)) AS DATE))
- AND M.DataBaseID = N.DataBaseID AND M.FileID = N.FileID
- WHERE M.Date_CD = CAST(REPLACE(CONVERT(varchar(10),GETDATE(),120),'-','') AS INT)
- ) TMP
- ON
- (
- DM.Date_CD = TMP.Date_CD AND
- DM.DatabaseId = TMP.DataBaseId AND
- DM.FileId = TMP.FileId
- )
- WHEN MATCHED THEN UPDATE SET
- DM.Growth_MOM_RAT = TMP.Growth_MOM_RAT;
- END
- GO
顺便吐槽一下:由于前两年一直使用ORACLE数据库,很少接触SQL SERVER,在实现上面功能的时候,我深深的体会到了ORACLE和SQL SERVER的巨大差距,如果用PL/SQL实现,那非常方便快捷,但是用T-SQL让我遇到了几个相当痛苦地方,下面顺便记录对比一下吧:
SELECT CAST(REPLACE(CONVERT(varchar(10),GETDATE(),120),'-','') AS INT);
SELECT TO_CHAR(Date_CD, 'YYYYMMDD') FROM DUAL;
- UPDATEdbo.DiskCapacityHistory
- SET GROWTH_MOM_RAT =( SELECTCASE WHEN N.SIZE IS NULL
- OR N.SIZE = 0 THEN 0
- ELSE ( dbo.DiskCapacityHistory.SIZE
- - N.SIZE ) / N.SIZE
- END AS Growth_MOM_RAT
- FROM dbo.DiskCapacityHistory N
- WHERE CAST(CAST(dbo.DiskCapacityHistory.Date_CD AS CHAR(8)) AS DATE) = DATEADD(MONTH,
- 1,
- CAST(CAST(N.Date_CD AS CHAR(8)) AS DATE))
- AND dbo.DiskCapacityHistory.DataBaseID = N.DataBaseID
- AND dbo.DiskCapacityHistory.FileID = N.FileID
- )
- WHEREdbo.DiskCapacityHistory.Date_CD = CAST(REPLACE(CONVERT(VARCHAR(10), GETDATE(), 120),
- '-', '') AS INT)
- UPDATEdbo.DiskCapacityHistory
- SET GROWTH_YOY_RAT =( SELECTCASE WHEN N.SIZE IS NULL
- OR N.SIZE = 0 THEN 0
- ELSE ( dbo.DiskCapacityHistory.SIZE
- - N.SIZE ) / N.SIZE
- END AS Growth_YOY_RAT
- FROM dbo.DiskCapacityHistory N
- WHERE CAST(CAST(dbo.DiskCapacityHistory.Date_CD AS CHAR(8)) AS DATE) = DATEADD(MONTH,
- 12,
- CAST(CAST(N.Date_CD AS CHAR(8)) AS DATE))
- AND dbo.DiskCapacityHistory.DataBaseID = N.DataBaseID
- AND dbo.DiskCapacityHistory.FileID = N.FileID
- )
- WHEREdbo.DiskCapacityHistory.Date_CD = CAST(REPLACE(CONVERT(VARCHAR(10), GETDATE(), 120),
- '-', '') AS INT)
- CREATE TABLE #DiskCapacityHistory
- (
- DATE_CD INT ,
- DataBaseID INT ,
- FileID INT ,
- Growth_MOM_RAT FLOAT
- ) ;
- INSERTINTO #DiskCapacityHistory
- SELECT M.DATE_CD ,
- M.DataBaseID ,
- M.FileID ,
- CASE WHEN N.SIZE IS NULL
- OR N.SIZE = 0 THEN 0
- ELSE ( M.SIZE - N.SIZE ) / N.SIZE
- END AS Growth_MOM_RAT
- FROM dbo.DiskCapacityHistory M ,
- dbo.DiskCapacityHistory N
- WHERE CAST(CAST(M.Date_CD AS CHAR(8)) AS DATE) = DATEADD(MONTH, 1,
- CAST(CAST(N.Date_CD AS CHAR(8)) AS DATE))
- AND M.DataBaseID = N.DataBaseID
- AND M.FileID = N.FileID
- AND M.Date_CD = CAST(REPLACE(CONVERT(VARCHAR(10), GETDATE()
- - 1, 120), '-', '') AS INT)
- UPDATE dbo.DiskCapacityHistory
- SET Growth_MOM_RAT = M.Growth_MOM_RAT
- FROM #DiskCapacityHistory M
- WHERE dbo.DiskCapacityHistory.DATE_CD = M.DATE_CD
- AND dbo.DiskCapacityHistory.DataBaseID = M.DataBaseID
- AND dbo.DiskCapacityHistory.FileID = M.FileID ;
2: 幸好SQL 2008还把ORACLE的MERGE的功能给模仿了过来,但是T-SQL缺少ORACLE数据库强大的分析函数LAG,如果有这个,我计算环比,同比就非常方便了,一个SQL就搞定了,下面是个例子,本想把ORACLE的SQL也做个例子展现,但是又要建表、造数,折腾起来比较麻烦。
- MERGE INTO DM.TM_WGGBO_IDCTOBUSVOLDTL_DAY DM
- USING (
- SELECT *
- FROM (
- SELECT DATE_CD,
- CITY_ID,
- IDC_NODE,
- VOL_TYPE,
- LAG(IDC_VOL_RAT ) OVER(PARTITION BY CITY_ID,IDC_NODE,VOL_TYPE,SUBSTR(DATE_CD,7,2) ORDER BY SUBSTR(DATE_CD,0,6)) AS IDC_MOM_RAT ,
- LAG(IDC_VOL_RAT ) OVER(PARTITION BY CITY_ID,IDC_NODE,VOL_TYPE,SUBSTR(DATE_CD,5,4) ORDER BY SUBSTR(DATE_CD,0,4)) AS IDC_YOY_RAT ,
- FROM DM.TM_WGGBO_IDCTOBUSVOLDTL_DAY
- ) T
- WHERE EXISTS(SELECT 1 FROM ETL.T_IDCVOL_DAY_${ssid} WHERE DATE_CD = T.DATE_CD)
- ) TEMP
- ON (
- DM.DATE_CD = TEMP.DATE_CD AND
- DM.CITY_ID = TEMP.CITY_ID AND
- DM.IDC_NODE = TEMP.IDC_NODE AND
- DM.VOL_TYPE = TEMP.VOL_TYPE
- )
- WHEN MATCHED THEN
- UPDATE
- SET DM.IDC_MOM_RAT = TEMP.IDC_MOM_RAT ,
- DM.IDC_YOY_RAT = TEMP.IDC_YOY_RAT
- ;
- COMMIT;
MS SQL 监控数据/日志文件增长相关推荐
- 如何使用损坏或删除SQL Server事务日志文件重建数据库
This is the last article, but not the least one, in the SQL Server Transaction Log series. In this s ...
- 删除不需要的(辅助)SQL Server事务日志文件
This article explores the use of multiple SQL Server Transaction Log Files and the process of removi ...
- Sql server 2005日志文件太大,使其减小的方法
Sql server 2005日志文件太大,使其减小的方法 Sqlserver2005日志文件太大,使其减小的方法: 运行下面的三行 dbName为数据库名: backup log dbNamewit ...
- sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段
在Oracle.MySQL.MS SQL Server中创建自动增长字段 好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题... 一:Oracle Orac ...
- Zabbix监控网络设备日志文件及字段报警
Zabbix监控网络设备日志文件及字段报警 一.首先就是配置网络设备日志传送到zabbix存放日志的指定目录,一般目录为/var/log/ 需要配置rsyslog.conf 根据需求添加tcp或者ud ...
- 将本地的MS SQL Server数据导入到远程服务器上
该演示引导客户将本地的MS SQL Server数据导入到远程服务器上,供客户的网站使用. 首先登录到远程数据库服务器: 1.右击您准备导入数据的数据库,选择"所有任务"下的&qu ...
- nagios插件之监控MQA日志文件
监控MQA日志文件mqsgip.log,过滤<MO-SMS> smsgw_delivery(主动上行).<MO-SMS> report(报告上行).<MT-SMS> ...
- ZABBIX监控JAVA日志文件
最近开发人员有一个需求,监控java程序的报错日志,如日志中包含"ERROR"关键字的信息,就邮件告警,以下是具体实现方法. 一.创建模板 以上是已经创建好的模板,名为" ...
- 【电脑小技巧每日一讲:SQL server 2016日志文件的清理】
一.问题描述 本人在使用SQL server 2016过程中不断的删除还原数据库导致积累了大量的日志文件,因此老师给我们提供了一种解决办法,用于在保留数据的情况下收缩空间. 二.解决步骤 1.获取数据 ...
最新文章
- AuxreRP教学网站创始人郑建国:发挥Axure和原型真正的价值
- windows mysql.tar安装_MySQL的安装
- linux shell程序设计实验报告,linux的shell脚本实验报告
- C#帮助控件HelpProvider的使用
- React开发(274):ant design table额外展开行
- 北美暴风雨,Linux5.12被延迟6天发布
- android 画笔
- [FFmpeg] RGBA 和 YUV 存储方式
- html5有哪些优点,HTML5真正的优势优点有什么?
- 五子棋c语言代码光标,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
- 搜狗关键词挖掘工具,搜狗权重关键词挖掘工具
- php 中 normdist,说明 Excel 中的 NORMDIST 函数
- 【Jquery】文本框校验练习
- DNS劫持原理,DNS劫持如何解决?
- 有些事情让感情无处安放
- 打印1000~2000年之间的闰年
- 刘钰02018010219
- 小程序使用node.js开发后台接口
- 大规模数据存储技术之Erasure Code(EC编码)
- java内部类以及使用场景