DBAtlas · 数据库运维图谱

从 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。事件写入有延迟,新死锁几秒后才会出现。只读;安全。

在 DBAtlas 中打开 →

相关内容