从 system_health 会话读取历史死锁(死锁图)
SQL Server性能命令
SET QUOTED_IDENTIFIER ON; -- required for XML methods (sqlcmd/Agent default is OFF)
WITH dl AS (
SELECT CAST(event_data AS XML) AS x
FROM sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
WHERE object_name = N'xml_deadlock_report'
)
SELECT TOP (20)
x.value('(event/@timestamp)[1]', 'datetime2') AS utc_time,
x.value('(event/data/value/deadlock/victim-list/victimProcess/@id)[1]', 'varchar(50)') AS victim,
x.value('count(event/data/value/deadlock/process-list/process)', 'int') AS process_count,
x.value('(event/data/value/deadlock/process-list/process/@currentdbname)[1]', 'sysname') AS db,
x.query('event/data/value/deadlock') AS deadlock_graph
FROM dl
ORDER BY utc_time DESC;作用
从 system_health 扩展事件会话(默认开启)的 event_file 目标读取 xml_deadlock_report 事件;对每个死锁返回时间(UTC)、牺牲进程、参与者数量、数据库以及完整的死锁图 XML。
适用场景
应用报告错误 1205 时、分析死锁频率及涉及的对象时;适用于未启用跟踪标志 1222 的服务器。
注意
system_health 文件会滚动覆盖;在繁忙的服务器上较早的死锁可能已不存在,如需永久归档请建立专用的 XE 会话。读取大量文件会消耗 CPU;业务时间内保留 TOP。事件写入有延迟,新死锁几秒后才会出现。只读;安全。