top

使用默认的扩展事件 system_health分析死锁(Deadlock) 适用于SQL2008

使用默认的扩展事件 system_health分析死锁(Deadlock) 适用于SQL2008

转载自:http://blog.csdn.net/kevinsqlserver/article/details/38417833

在2008之前我们分析死锁需要用profiler trace或者trace flag 1222,1204.在2008中引入了一个新功能:Extended Events(扩展事件),可以监控Deadlock事件,并且性能更好。 

 

而且2008自带了一个默认扩展事件会话system_health,如果你运行在2008或者之上版本可以执行下面查询: 

 

 select * from sys.dm_xe_sessions

 

其中system_health会收集很多重要的信息,之后出现问题可以用来分析。system_health会话收集信息参考http://msdn.microsoft.com/en-us/library/ff877955.aspx。其中一项内容是:Any deadlocks that are detected. 

 

 

也就是SQL Server会自动收集deadlock的信息,并记录在ring_buffer。通过分析ring_buffer就可以找到死锁原因,这样就不需要使用profiler或者Trace Flag收集信息。

 

使用下面的代码查看deadlock_report的内容:

 

  1. SELECT    xed.value('@timestamp','datetime')as Creation_Date,  
  2.   
  3.          xed.query('.')AS Extend_Event  
  4.   
  5.  FROM    (   SELECT   CAST([target_data]ASXML)AS Target_Data  
  6.   
  7.              FROM    sys.dm_xe_session_targetsAS xt  
  8.   
  9.                      INNER JOIN sys.dm_xe_sessionsAS xs  
  10.   
  11.                      ON xs.address= xt.event_session_address  
  12.   
  13.              WHERE    xs.name=N'system_health'  
  14.   
  15.                      AND xt.target_name=N'ring_buffer')  
  16.   
  17.  AS XML_Data  
  18.   
  19.  CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]')AS XEventData(xed)  
  20.   
  21.  ORDER BY Creation_DateDESC  


 

 

 

 

默认的system_health在不影响性能的情况下将一些重要事件记录下来,方便我们后期做分析,这是一个非常好的功能。避免了之前可能由于没有及时监控而找不到原因的状况。

复制代码
SELECT  CAST(xet.target_data AS XML)
FROM    sys.dm_xe_session_targets xet
        JOIN sys.dm_xe_sessions xe ON ( xe.address = xet.event_session_address )
WHERE   xe.name = 'system_health'


---------------------------------------------------------------------
--使用下面的代码查看deadlock_report的内容:
SELECT  xed.value('@timestamp', 'datetime') AS Creation_Date ,
        xed.query('.') AS Extend_Event
FROM    ( SELECT    CAST([target_data] AS XML) AS Target_Data
          FROM      sys.dm_xe_session_targets AS xt
                    INNER JOIN sys.dm_xe_sessions AS xs ON xs.address = xt.event_session_address
          WHERE     xs.name = N'system_health'
                    AND xt.target_name = N'ring_buffer'
        ) AS XML_Data
        CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]')
        AS XEventData ( xed )
ORDER BY Creation_Date DESC
复制代码

 

posted @   桦仔  阅读(813)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示