zoukankan      html  css  js  c++  java
  • SQL Server 死锁的告警监控

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

     

     

     

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

     

     

    clip_image001

     

     

     

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

     

     

     

     

    clip_image002

     

     

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

    GO

     

     

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

     

    DBCC TRACEON(1222,-1);

     

     

    clip_image003

     

  • 相关阅读:
    [转]多个ajax请求时控制执行顺序或全部执行后的操作
    [转]微擎目录结构介绍
    [书目20180702]互联网思维的企业
    [转]Oracle密码过期, 报:ORA-01017: 用户名/口令无效; 登录被拒绝
    [转]VR原理讲解及开发入门
    [转]JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐
    [转]bootstrapValidator.js 做表单验证
    [转]Build beautiful, responsive sites with Bootstrap and ASP.NET Core
    [转]C# Bootstrap table之 分页
    [转]Bootstrap table 分页 In asp.net MVC
  • 原文地址:https://www.cnblogs.com/kerrycode/p/7722350.html
Copyright © 2011-2022 走看看