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展示的配 ...
随机推荐
- Windows服务框架与服务的编写
从NT内核开始,服务程序已经变为一种非常重要的系统进程,一般的驻守进程和普通的程序必须在桌面登录的情况下才能运行,而许多系统的基础程序必须在用户登录桌面之前就要运行起来,而利用服务,可以很方便的实现这 ...
- C语言中处理结构体的原理
汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...
- 垃圾回收(GC) 的基本算法
GC 作为一个长久的话题,从诞生[1]至今也算是经历了六七十年了,对于很多习惯于使用 Java/Python 的同学来说,对于内存的管理可能会稍微更陌生一些,因为这些语言在语言层面就屏蔽了内存的分配和 ...
- AC自动机讲解
今天花了半天肝下AC自动机,总算啃下一块硬骨头,熬夜把博客赶出来.. 正如许多博客所说,AC自动机看似很难很妙,而事实上不难,但的确很妙.笼统地说,AC自动机=Trie+KMP,但是仅仅知道这个并没有 ...
- Hadoop(十六)之使用Combiner优化MapReduce
前言 前面的一篇给大家写了一些MapReduce的一些程序,像去重.词频统计.统计分数.共现次数等.这一篇给大家介绍的是关于Combiner优化操作. 一.Combiner概述 1.1.为什么需要Co ...
- js面向对象学习笔记(五):tab切换
重点是this指向问题 <style> .hide{display: none;} #box div,#box1 div{display: none;} .hover{background ...
- 0/1背包 dp学习~6
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 I NEED A OFFER! Time Limit: 2000/1000 MS (Java/O ...
- angular $modal模态框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [国嵌笔记][020][ARM家族大检阅]
ARM芯片:2440(arm9) 6410(arm11) 210(cortex-A8) ARM核:arm9(arm-v4) arm11(arm-v6) cortex-A8(arm-v7) 指令架构:a ...
- 基础二 day4 日记
1.list增删改查 l1 = [1,'alex',True,[1,2,3],(2,3,4),{'name':'alex'}]l1 = ['alex',True,'wusir','ritian','t ...