DBAtlas · Atlas für Datenbankbetrieb

Vergangene Deadlocks aus der system_health-Session lesen (Deadlock-Graph)

SQL ServerPerformance

Befehl

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;

Was es tut

Liest xml_deadlock_report-Events aus dem event_file-Target der Extended-Events-Session system_health (standardmäßig aktiv); liefert für jeden Deadlock Zeitpunkt (UTC), Opferprozess, Anzahl der Beteiligten, Datenbank und das vollständige Deadlock-Graph-XML.

Wann einsetzen

Wenn die Anwendung Fehler 1205 meldet, beim Analysieren der Deadlock-Häufigkeit und der beteiligten Objekte; auf Servern ohne Trace Flag 1222.

Vorsicht

system_health-Dateien rotieren; auf einem ausgelasteten Server sind ältere Deadlocks eventuell weg, richte daher für ein dauerhaftes Archiv eine eigene XE-Session ein. Das Lesen vieler Dateien kostet CPU; behalte TOP während der Geschäftszeit bei. Events werden verzögert geschrieben, ein neuer Deadlock erscheint also nach einigen Sekunden. Nur Lesen; sicher.

In DBAtlas öffnen →

Verwandte Einträge