MS SQL 监控数据/日志文件增长

- USE msdb;
- GO
- IF EXISTS (SELECT 1 FROM dbo.sysobjects WHERE id = OBJECT_ID(N'') AND xtype='U')
- DROP TABLE DiskCapacityHistory;
- GO
- CREATE 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)
- );


接下来,我们创建存储过程,负责来收集、统计这些数据库的文件的相关信息。关于环比/同比,正常情况一般是:
环比: (指标当前值 - 指标值(上个月同一天))/ 指标值(上个月同一天) 。
同比: (指标当前值 - 指标值(去年月同一天))/ 指标值(去年月同一天) 。
其实如果关注每天的数据文件变化情况,这个代码里面的环比、同比其实意义不大,其实我们可以这样定义环比、同比:
环比: (指标当前值 - 指标值(昨天))/指标值(昨天)。
同比: (指标当前值 - 指标值 (上个月))/指标值(上个月)
当然,你也可以把这四个指标都加上,对比参考,侧重点不同而已。
- 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 监控数据/日志文件增长的更多相关文章
- 清理ms sql server 大日志文件数据
1.手动分离数据库: 2.手动删除日志文件: 3.重新生成日志文件: CREATE DATABASE FMIS0 ON (FILENAME = 'E:\FMIS0_DATA\FMIS0-Date') ...
- MS SQL 需要定期清理日志文件
前言碎语 关于对SQL SERVER 日志文件管理方面了解不多的话,可以参考我的这篇博客文章“MS SQL 日志记录管理”,不过这篇文章只是介绍对SQL SERVER日志记录的深入认知了解,并没有提出 ...
- MS SQL 监控错误日志的告警信息
SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高.但是如果你统计sys.messages,你会发现,实际上只有16(SQL ...
- SQL Server 日志文件增长原因定位
方法 1.sys.databases; -------------------------------------------------------------------------------- ...
- MS SQL SERVER 数据库日志压缩方法与代码
MS SQL性能是很不错的,但是数据库用了一段时间之后,数据库却变得很大,实际的数据量不大.一般都是数据库日志引起的!数据库日志的增长可以达到好几百M. DUMP TRANSACTION [数据库名] ...
- SQL Server 2005 日志文件过大处理
由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份.截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了. 备份和计划就不说了,现在就说下怎么把它先删除吧: 1 ...
- (转载)SQL Server 2005 日志文件过大处理
由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份.截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了. 备份和计划就不说了,现在就说下怎么把它先删除吧: 1 ...
- tempdb 日志文件增长的问题
前两天在一个客户那里发现tempdb log 文件增长很大,已经使用40GB了,而tempdb log 文件总的分配空间是70GB,并且日志空间貌似不能重用,他们使用sql 2012 打的sp4补丁, ...
- Docker-compose搭建ELK环境并同步MS SQL Server数据
前言 本文作为学习记录,供大家参考:一次使用阿里云(Aliyun)1核2G centos7.5 云主机搭建Docker下的ELK环境,并导入MS SQL Server的商品数据以供Kibana展示的配 ...
随机推荐
- 使用JavaScript 操作本地文件
一.显示用户选择文件[图片] <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 在ASP.NET Core 2.0中使用MemoryCache
说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...
- 调出js控制台可以在浏览器地址栏输入about:blank
调出js控制台可以在浏览器地址栏输入about:blank,如果不输入about:blank,直接 打开一个新的页面,有可能输出的结果不准确.也就是说变量有可能被其他的影响到, 造成结果不准确.
- AWS上获取监控数据(EC2/RDS都支持)
方法1:mon-cmd http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/cli/SetupCLI.html(安装连接) ● Step ...
- vs2012 .net4.0 nuget 导入NHibernate4.0版本
问题描述: 最近弄一个项目,打算使用NHibernate,本人使用的VS2012,项目用的是.NET 4.0.在使用Nuget安装引用的时候,发现安装失败,提示如下图: 意思是当前安装的NHibern ...
- cs231n spring 2017 lecture15 Efficient Methods and Hardware for Deep Learning 听课笔记
1. 深度学习面临的问题: 1)模型越来越大,很难在移动端部署,也很难网络更新. 2)训练时间越来越长,限制了研究人员的产量. 3)耗能太多,硬件成本昂贵. 解决的方法:联合设计算法和硬件. 计算硬件 ...
- CSS 选择器参考手册
CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. "CSS" 列指示该属性是在哪个 CSS 版本中定义的.(CSS1.CSS2 还是 CSS3.) ...
- 数值积分之Simpson公式与梯形公式
Simpson(辛普森)公式和梯形公式是求数值积分中很重要的两个公式,可以帮助我们使用计算机求解数值积分,而在使用过程中也有多种方式,比如复合公式和变步长公式.这里分别给出其简单实现(C++版): 1 ...
- python 模块中的 __init__.py __main__.py
python中文件夹想作为一个模块被引用,则在文件夹内必须要包含 __init__.py 文件,即使此文件为空. 如果此模块想要运行则必须要包含 __main__.py 文件.接下来说下两个文件起到的 ...
- CentOS、Ubuntu、Debian三个linux比较异同[转]
Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本. 商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点, ...