Необходимые данные записываются в расширенную трассировку событий по умолчанию.
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 в табличный формат здесь .