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展示的配 ...
随机推荐
- COM学习(三)——COM的跨语言
COM是基于二进制的组件模块,从设计之初就以支持所有语言作为它的一个目标,这篇文章主要探讨COM的跨语言部分. idl文件 一般COM接口的实现肯定是以某一具体语言来实现的,比如说使用VC++语言,这 ...
- 【读书笔记】【深入理解ES6】#9-JavaScript中的类
大多数面向对象的编程语言都支持类和类继承的特性,而JavaScript却不支持这些特性,只能通过其他方法定义并关联多个相似的对象.这个状态一直从ECMAScript 1持续到ECMAScript 5. ...
- Django-环境搭建
django开发环境搭建 环境说明 python django mysql pymysql pycharm 安装过程 安装python3.6.3 64位下载地址: https://www.python ...
- python 错误:"'NoneType' object has no attribute 'execute'"
这种原因常常是数据库链接产生的错误,检查连接参数时候齐全,cursor是否获取到了.
- 【iOS】控件截图、MP4格式视频流和m3u8格式视频流截取某一帧功能的实现
最近开发遇到一个点击按钮实现直播视频流截屏的功能,去网上查了一下资料,总结了一下iOS中截屏相关的知识,然后自己做了个demo. demo主要实现了3种截屏方法,分别对应三种不同的应用场景. 1.im ...
- poj 3261
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13249 Accepted: 5894 Ca ...
- hdu_1286找新朋友(欧拉定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286 找新朋友 Time Limit: 2000/1000 MS (Java/Others) M ...
- C. The Smallest String Concatenation
C. The Smallest String Concatenation time limit per test 3 seconds memory limit per test 256 megabyt ...
- 动态计算rem的js代码
以最小1024尺寸为例: function rem() { var htmlEle = document.documentElement; var winWidth = htmlEle.clientW ...
- SDP(1):ScalikeJDBC-基本操作介绍
简单来说:JDBC是一种开放标准的跨编程语言.跨数据库类型编程API.各类型数据库产品厂商都会按它的标准要求来提供针对自身产品的JDBC驱动程序.最主要的这是一套成熟的工具,在编程人员中使用很普及.既 ...