今天这篇文章总结一下如何监控SQL Server的死锁,其实以前写过MS SQL 监控错误日志的告警信息,这篇文章着重介绍如何监控数据库的死锁,当然这篇文章不分析死锁产生的原因、以及如何解决死锁。死锁(Dead Lock)的错误信息在sys.messages中的message_id为1205,可以使用下面SQL查看。

SELECT * FROM sys.messages WHERE message_id=1205

那么接下来,我们来设置一下死锁(Dead Lock)告警吧, 如下所示,当然你可以使用UI界面设置。

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF EXISTS(SELECT 1 FROM msdb.dbo.sysalerts WHERE name='SQL Server Dead Lock Detected')

BEGIN

    EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Dead Lock Detected';

END

GO

 

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.sysalerts WHERE name='SQL Server Dead Lock Detected')

BEGIN

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Dead Lock Detected', 

        @message_id=1205, 

        @severity=0, 

        @enabled=1, 

        @delay_between_responses=0, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

END

GO

 

IF NOT EXISTS ( SELECT  *

                FROM    msdb.dbo.sysnotifications

                WHERE   alert_id = ( SELECT id

                                     FROM   msdb.dbo.sysalerts

                                     WHERE  name = 'SQL Server Dead Lock Detected'

                                   ) )

    BEGIN

 

        EXEC msdb.dbo.sp_add_notification @alert_name = N'SQL Server Dead Lock Detected',

            @operator_name = N'YourSQLDba_Operator', @notification_method = 1;

    END;

GO

执行上面脚本后,就会在SQL Server的告警里面新增一个名为SQL Server Dead Lock Detected'的告警,那么现在是否OK了呢?当然不是,我们来测试验证一下吧,首先准备测试的表和数据。

USE YourSQLDba;

GO

CREATE TABLE DEADLOCK1(ID INT DEFAULT(0));

CREATE TABLE DEADLOCK2(ID INT DEFAULT(0));

INSERT INTO DEADLOCK1 VALUES(1);

INSERT INTO DEADLOCK2 VALUES(1);

GO

如下所示,在两个会话窗口执行下面脚本,构造死锁出现的场景。

--会话窗口1执行下面SQL

BEGIN TRAN

UPDATE DEADLOCK1 SET ID=ID+1;

WAITFOR DELAY '00:00:20';

SELECT * FROM DEADLOCK2

ROLLBACK TRAN;

EXEC master..sp_altermessage 1205, 'WITH_LOG', TRUE;

GO

--会话创建2执行下面SQL

BEGIN TRAN

UPDATE DEADLOCK2 SET ID=ID+1;

WAITFOR DELAY '00:00:20';

SELECT * FROM DEADLOCK1

ROLLBACK TRAN;

如下截图所示,当死锁出现后,那么这个告警设置是否会发送邮件出来呢? 答案是否定的,你可以检查告警的历史情况,如下所示:

从History界面,我们可以看到这个告警没有被触发,那么这个是什么原因呢?原因其实很简单,因为message_id为1205的消息字段is_event_logged默认是0,这意味着出现错误消息将不会记入事件日志。我们可以使用小SQL将其值设置为1

EXEC master..sp_altermessage 1205, 'WITH_LOG', TRUE;

GO

执行上面脚本后,message_id为1205的记录的is_event_logged字段值将被设置为1,当数据库出现死锁时,就会被记录到错误日志,当然这个只是简单消息的记录,如果你要跟踪、解决死锁问题,就需要记录死锁的详细信息,需要在服务端针对所有的Session开启Trace flag 1222。

DBCC TRACEON(1222,-1);

SQL Server 死锁的告警监控的更多相关文章

  1. SQL Server死锁的解除方法

    如果想要查出SQL Server死锁的原因,下面就教您SQL Server死锁监控的语句写法,如果您对此方面感兴趣的话,不妨一看. 下面的SQL语句运行之后,便可以查找出SQLServer死锁和阻塞的 ...

  2. SQL Server添加MDW性能监控报表(转载)

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

  3. SQL Server死锁

    SQL Server死锁 多个事务之间互相等待对方的资源,导致这些事务永久等待 注意是永久等待,而非长事务 死锁的4个条件 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程 ...

  4. windows系统与SQL SERVER 2008数据库服务性能监控分析简要

    软件系统性能测试体系流程介绍之windows系统与SQL SERVER 2008数据库服务性能监控分析简要 目前大部分测试人员对操作系统资源.中间件.数据库等性能监控分析都是各自分析各自的监控指标方式 ...

  5. Update导致SQL Server死锁的典型方法(转载)

    此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个 ...

  6. 通过Python实现对SQL Server 数据文件大小的监控告警

    1.需求背景 系统程序突然报错,报错信息如下: The transaction log for database '@dbname' is full. To find out why space in ...

  7. SQL Server——死锁查看

    一.通过语句查看 --查询哪些死锁SELECT request_session_id spid, OBJECT_NAME( resource_associated_entity_id ) tableN ...

  8. SQL Server ---(CDC)监控表数据(转译)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  9. SQL Server添加MDW性能监控报表

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

随机推荐

  1. C#基础(二)--之数据类型

    在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...

  2. JAVA设计模式---模板方法

    1.定义: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. (为了防止子类改变模板方法中的算法,可以将模板方法声明为 ...

  3. web框架之Django基础

    1. Django的简介 Django是一个由python写成的开放源代码的Web应用框架. Django的目的是使常见的Web开发任务,快速和容易. 2. Django框架的特点 1. 遵循MVC开 ...

  4. 认识python中的set集合及其用法

    python中,集合(set)是一个无序排列,可哈希, 支持集合关系测试,不支持索引和切片操作,没有特定语法格式, 只能通过工厂函数创建.集合里不会出现两个相同的元素, 所以集合常用来对字符串或元组或 ...

  5. 免费分享Navicat12各版本破解(仅供学习使用)

    花了几个小时终于找到比较"绿色"的安装包了...(无力吐槽下现在网上好多挂羊头卖狗肉的网站) https://pan.baidu.com/s/1geMIkfT 密码:9a98 里面 ...

  6. 正确理解python的装饰器

    一直在用别人写的装饰器,从来没有对其原理进行深入的探究.今天趁有点闲着的时间,把装饰器的原理好好看了一遍,做一下整理. 一.装饰器的基本原理 装饰器就是一个可以接受调用也可以返回调用的调用.装饰器本身 ...

  7. 洛谷 [P3258] 松鼠的新家

    树上差分 对于一条路径 \(u->v\) 来说,设 \(t=LCA(u,v)\) ,d[]为差分数组 ,则有 d[u]++;d[v]++;d[t]--;d[fa[t]]--; 注意:题目中所给的 ...

  8. HDU 4372 Count the Buildings [第一类斯特林数]

    有n(<=2000)栋楼排成一排,高度恰好是1至n且两两不同.现在从左侧看能看到f栋,从右边看能看到b栋,问有多少种可能方案. T组数据, (T<=100000) 自己只想出了用DP搞 发 ...

  9. BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501 ...

  10. 3.C++内联函数,默认参数,占位参数

    本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本 ...