DBAtlas · Атлас эксплуатации баз данных

Чтение прошлых взаимоблокировок из сеанса system_health (deadlock graph)

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;

Что делает

Читает события xml_deadlock_report из цели event_file сеанса Extended Events system_health (включён по умолчанию); для каждой взаимоблокировки возвращает время (UTC), процесс-жертву, число участников, базу данных и полный XML графа взаимоблокировки.

Когда использовать

Когда приложение сообщает об ошибке 1205, при анализе частоты взаимоблокировок и задействованных объектов; на серверах без флага трассировки 1222.

Внимание

Файлы system_health перезаписываются по кругу; на нагруженном сервере старые взаимоблокировки могут пропасть, поэтому для постоянного архива настройте отдельный сеанс XE. Чтение многих файлов расходует CPU; в рабочие часы оставляйте TOP. События пишутся с задержкой, поэтому новая взаимоблокировка появляется через несколько секунд. Только чтение; безопасно.

Открыть в DBAtlas →

Связанные материалы