在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原因。
使用下面的代码查看deadlock_report的内容:
1
2
3
4
5
6
7
8
9
10
11
|
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_targetsAS xt
INNERJOIN sys.dm_xe_sessions
AS
xs
ONxs.address = xt.event_session_address
WHERE
xs.
name
= N
'system_health'
ANDxt.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
|
默认的system_health在不影响性能的情况下将一些重要事件记录下来,方便我们后期做分析,这是一个非常好的功能。避免了之前可能由于没有及时监控而找不到原因的状况。
本文转自 lzf328 51CTO博客,原文链接:
http://blog.51cto.com/lzf328/1536869