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展示的配 ...
随机推荐
- 登陆模块的进化史,带大家回顾java学习历程(一)
一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写. 大家在网上查找资料看到最多的demo估计就是登陆功能的演示了,为何大家偏爱拿登陆来做demo呢?因为行业应用类程序的 ...
- mmap函数实现
转自:https://www.cnblogs.com/huxiao-tee/p/4660352.htmlmmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址 ...
- 一个通用的Makefile(二)
1.各级子目录的Makefile: obj-y += file.o obj-y += subdir/ “obj-y += file.o” 表示把当前目录下的file.c编进程序里. “obj-y += ...
- LVS集群之原理及概述(1)
一. 概述 什么是集群,集群的特点.功能和分类.Linux环境下用哪些开源软件来构建一个功能强而有稳定的集群系统.了解国人内核级负载均衡开源项目linux虚拟服务器,简称LVS. 1.1 定义 集群是 ...
- mysql 在B数据库下 创建一个与A数据库中一样的表
1.创建数据内容与结构一致(不会复制索引以及外键) create table B.test as select * from A.test; 2.把上面的步骤分开,先复制结构 create table ...
- Wing ide 6.0 注册 ,python 3.6环境
直接切入主题,套路如下: 1.选择手动输入license license number输入:CN123-12345-12345-12345 2.在下一步中,选择第二项,拷贝的request code ...
- java字符串比较
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在j ...
- 循序渐进之Spring AOP(4) - Introduction
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法. 在spring中可以通过扩展DelegatingIntro ...
- CCNA笔记(1)
一个最简单的图来了解网络结构 一个路由器经过数据传输,目标pc的网卡网线接受数据,使数据能交换,然后就连上了互联网
- deeplearning.ai 作业中的Python常用命令
1. print大法 test = Hello World print ("test:" + test) 2. math和numpy的区别:math只对单个元素,numpy会bro ...