Необхідні дані записуються у розширений слід подій за замовчуванням.
DECLARE @xml XML
SELECT @xml = target_data
FROM sys.dm_xe_session_targets
JOIN sys.dm_xe_sessions
ON event_session_address = address
WHERE name = 'system_health'
AND target_name = 'ring_buffer'
SELECT
XEventData.XEvent.query('(data/value/deadlock)[1]') AS DeadlockGraph,
CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM (SELECT @xml AS TargetData) AS Data
CROSS APPLY
TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent)
ORDER BY [DateTime] DESC
Хоча його більше не буде, якщо ви перезапустили службу -eg, щоб застосувати прапор сліду або якщо буфер тим часом пройшов цикл.
Ви можете встановити свій власний розширений трасування подій, який зберігає графік тупикового кута до цільового файлу для стійкого нелетучого зберігання. Приклад коду тут . Я особисто вважаю, що графік тупикової XML є більш привітним, ніж вихід прапора трасування.
Редагувати
- @MartinC в коментарях зазначає, що у випадках, коли SQL Server не має всіх оновлень, може виникнути проблема з цим генерувати недійсний XML. Виправленням цього є певний пошук та заміна та використання
CAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph
у SELECT
списку, як описано тут .
- Уейн Шеффілд опублікував корисний скрипт подрібнювати тупиковий граф XML в табличний формат тут .