死锁监控一直都很麻烦,我没有找到很好的方法
如果大家有好的方法,我也很想学习一下
我的方法比较简单:
1.sp_altermessage 1205 修改1205 错误让他能够写入日志 这样 代理中的警告才能使用
2.当然是启动 代理中的警告。开数据库邮件,会把死锁错误发送到操作员邮箱里面。缺点就是没有详细的死锁信息。
3.使用sql server 2008 r2 自带的 扩展事件中system_health默认是开启的,里面会抓取比较多的值
你可以使用 sys.dm_xe_session_events 联合 sys.dm_xe_sessions 查看 抓取了那些值 当然其中一个是死锁信息。
当产生死锁的时候你何以使用:
SELECT
REPLACE
(
REPLACE
(XEventData.XEvent.value(
'
(data/value)[1]
'
,
'
varchar(max)
'
),
'
<victim-list>
'
,
'
<deadlock><victim-list>
'
),
'
<process-list>
'
,
'
</victim-list><process-list>
'
)
FROM
(
select
CAST
(target_data
as
xml)
as
TargetData
from
sys.dm_xe_session_targets st
join
sys.dm_xe_sessions s
on
s.address
=
st.event_session_address
where
name
=
'
system_health
'
)
AS
Data
CROSS
APPLY TargetData.nodes (
'
//RingBufferTarget/event
'
)
AS
XEventData (XEvent)
where
XEventData.XEvent.value(
'
@name
'
,
'
varchar(4000)
'
)
=
'
xml_deadlock_report
'
查询所有的死锁信息,当然如果出现内存瓶颈的时候能保存多久我不确定,如果死锁太多你无法顺利的找到,你想把结果减少一点,可以在每次查询死锁后使用:
ALTER
EVENT SESSION system_health
ON
SERVER
STATE
=
stop
go
ALTER
EVENT SESSION system_health
ON
SERVER
STATE
=
start
关闭并打开这个扩展事件的session,那么保存在内存的记录就会被清空。下次的死锁信息就是最新的。

