Konvertieren eines vorhandenen SQL-Ablaufverfolgungsskripts in eine Sitzung für erweiterte Ereignisse
Wenn Sie ein vorhandenes SQL-Ablaufverfolgungsskript haben, das Sie in eine Sitzung für erweiterte Ereignisse konvertieren möchten, können Sie die Vorgehensweisen in diesem Thema verwenden, um eine entsprechende Sitzung für erweiterte Ereignisse zu erstellen. Mit den Informationen in den Systemtabellen trace_xe_action_map und trace_xe_event_map können Sie die Informationen sammeln, die für die Konvertierung erforderlich sind.
Die Schritte umfassen Folgendes:
Führen Sie das vorhandene Skript aus, um eine SQL-Ablaufverfolgungssitzung zu erstellen, und rufen Sie dann die ID der Ablaufverfolgung ab.
Führen Sie eine Abfrage aus, die die fn_trace_geteventinfo-Funktion verwendet, um die entsprechenden Ereignisse für erweiterte Ereignisse und die Aktionen für die einzelnen SQL-Ablaufverfolgungs-Ereignisklassen sowie ihre zugeordneten Spalten zu suchen.
Verwenden Sie die fn_trace_getfilterinfo-Funktion, um die zu verwendenden Filter und die entsprechenden Aktionen für erweiterte Ereignisse aufzulisten.
Erstellen Sie mithilfe der entsprechenden Ereignisse, Aktionen und Prädikate (Filter) für erweiterte Ereignisse manuell eine Sitzung für erweiterte Ereignisse.
So rufen Sie die Ablaufverfolgungs-ID ab
Öffnen Sie das SQL-Ablaufverfolgungsskript im Abfrage-Editor, und führen Sie dann das Skript aus, um die Ablaufverfolgungssitzung zu erstellen. Die Ablaufverfolgungssitzung muss nicht ausgeführt werden, um diese Vorgehensweise auszuführen.
Rufen Sie die ID der Ablaufverfolgung ab. Verwenden Sie hierzu die folgende Abfrage:
SELECT * FROM sys.traces; GO
Hinweis Die Ablaufverfolgungs-ID 1 gibt in der Regel die Standardablaufverfolgung an.
So bestimmen Sie die Entsprechungen für erweiterte Ereignisse
Um die entsprechenden Ereignisse und Aktionen für erweiterte Ereignisse zu bestimmen, führen Sie die folgende Abfrage aus, wobei trace_id auf den Wert der Ablaufverfolgungs-ID festgelegt wird, die Sie in der vorherigen Vorgehensweise abgerufen haben.
Hinweis In diesem Beispiel wird die Ablaufverfolgungs-ID für die Standardablaufverfolgung (1) verwendet.
USE MASTER; GO DECLARE @trace_id int; SET @trace_id = 1; SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event' , el.columnid, ec.xe_action_name AS 'action' FROM (sys.fn_trace_geteventinfo(@trace_id) AS el LEFT OUTER JOIN sys.trace_xe_event_map AS em ON el.eventid = em.trace_event_id) LEFT OUTER JOIN sys.trace_xe_action_map AS ec ON el.columnid = ec.trace_column_id WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;
Die entsprechende Ereignis-ID für erweiterte Ereignisse, der Paketname, der Ereignisname, die Spalten-ID und der Aktionsname werden zurückgegeben. Diese Ausgabe verwenden Sie in der Vorgehensweise "So erstellen Sie die Sitzung für erweiterte Ereignisse" weiter unten in diesem Thema.
In einigen Fällen wird einem Ereignisdatenfeld, das standardmäßig im Ereignis für erweiterte Ereignisse enthalten ist, die gefilterte Spalte zugeordnet. Daher ist die Spalte "Extended_Events_action_name" NULL. Wenn dies auftritt, müssen Sie wie folgt vorgehen, zu bestimmen, welches Datenfeld der gefilterten Spalte entspricht:
Identifizieren Sie für die Aktionen, die NULL zurückgeben, welche SQL-Ablaufverfolgungs-Ereignisklassen in dem Skript die gefilterte Spalten enthalten.
Möglicherweise haben Sie z. B. die SP:StmtCompleted-Ereignisklasse verwendet und einen Filter für die Duration-Ablaufverfolgungsspaltennamen (SQL-Ablaufverfolgungs-Ereignisklassen-ID 45 und SQL-Ablaufverfolgungsspalten-ID 13) angegeben. In diesem Fall wird der Aktionsname in den Abfrageergebnissen als NULL angezeigt.
Suchen Sie für jede SQL-Ablaufverfolgungs-Ereignisklasse, die Sie im vorherigen Schritt identifiziert haben, den entsprechenden Namen des Ereignisses für erweiterte Ereignisse. (Wenn Sie nicht sicher sind, wie der entsprechende Ereignisname lautet, verwenden Sie die Abfrage im Thema Anzeigen der Entsprechungen von erweiterten Ereignissen für SQL-Ablaufverfolgungsklassen.)
Verwenden Sie die folgende Abfrage, um die richtigen Datenfelder zu identifizieren, die für die Ereignisse verwendet werden sollen, die Sie im vorherigen Schritt identifiziert haben. Die Abfrage zeigt die Datenfelder für erweiterte Ereignisse in der "event_field"-Spalte an. Ersetzen Sie in der Abfrage <event_name> durch den Namen eines Ereignisses, das Sie im vorherigen Schritt angegeben haben.
SELECT xp.name package_name, xe.name event_name ,xc.name event_field, xc.description FROM sys.trace_xe_event_map AS em INNER JOIN sys.dm_xe_objects AS xe ON em.xe_event_name = xe.name INNER JOIN sys.dm_xe_packages AS xp ON xe.package_guid = xp.guid AND em.package_name = xp.name INNER JOIN sys.dm_xe_object_columns AS xc ON xe.name = xc.object_name WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly' AND em.xe_event_name = '<event_name>';
Dem sp_statement_completed-Ereignis für erweiterte Ereignisse wird beispielsweise die SP:StmtCompleted-Ereignisklasse zugeordnet. Wenn Sie sp_statement_completed in der Abfrage als Ereignisnamen angeben, werden in der "event_field"-Spalte die Felder angezeigt, die standardmäßig in dem Ereignis enthalten sind. Wenn Sie sich die Felder ansehen, werden Sie sehen, dass es ein Feld "duration" gibt. Um den Filter in der entsprechenden Sitzung für erweiterte Ereignisse zu erstellen, würden Sie ein Prädikat, z. B. "WHERE duration > 0" hinzufügen. Ein Beispiel finden Sie in der Vorgehensweise "So erstellen Sie die Sitzung für erweiterte Ereignisse" weiter unten in diesem Thema.
So erstellen Sie die Sitzung für erweiterte Ereignisse
Verwenden Sie den Abfrage-Editor, um die Sitzung für erweiterte Ereignisse zu erstellen und die Ausgabe in eine Dateiziel zu schreiben. Die folgenden Schritte beschreiben eine einzelne Abfrage, mit Erklärungen, um Ihnen zu zeigen, wie die Abfrage erstellt wird. Die vollständige Beispielabfrage finden Sie im Abschnitt "Beispiel" dieses Themas.
Fügen Sie Anweisungen hinzu, um die Ereignissitzung zu erstellen, und ersetzen Sie session_name durch den Namen, den Sie für die Sitzung für erweiterte Ereignisse verwenden möchten.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [Session_Name] ON SERVER; CREATE EVENT SESSION [Session_Name] ON SERVER;
Fügen Sie die Ereignisse und Aktionen für erweiterte Ereignisse hinzu, die in der Vorgehensweise "So bestimmen Sie die Entsprechungen für erweiterte Ereignisse" als Ausgabe zurückgegeben wurden, und fügen Sie die Prädikate (Filter) hinzu, die Sie in der Vorgehensweise "So bestimmen Sie die Filter, die im Skript verwendet werden" identifiziert haben.
Im folgenden Beispiel wird ein SQL-Ablaufverfolgungsskript, das die SQL:StmtStarting-Ereignisklasse und die SP:StmtCompleted-Ereignisklasse einschließt, mit Filtern für Sitzungs-ID und Dauer verwendet. Die Beispielausgabe für die Abfrage in der Vorgehensweise "So bestimmen Sie die Entsprechungen für erweiterte Ereignisse" gab das folgende Resultset zurück:
Eventid package_name event columnid action 44 sqlserver sp_statement_starting 6 nt_username 44 sqlserver sp_statement_starting 9 client_pid 44 sqlserver sp_statement_starting 10 client_app_name 44 sqlserver sp_statement_starting 11 server_principal_name 44 sqlserver sp_statement_starting 12 session_id 45 sqlserver sp_statement_completed 6 nt_username 45 sqlserver sp_statement_completed 9 client_pid 45 sqlserver sp_statement_completed 10 client_app_name 45 sqlserver sp_statement_completed 11 server_principal_name 45 sqlserver sp_statement_completed 12 session_id
Zur Konvertierung in die Entsprechung für erweiterte Ereignisse werden das sqlserver.sp_statement_starting-Ereignis und das sqlserver.sp_statement_completed-Ereignis mit einer Liste von Aktionen hinzugefügt. Prädikatanweisungen sind als WHERE-Klauseln eingeschlossen.
ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 )
Fügen Sie das asynchrone Dateiziel hinzu, und ersetzen Sie dabei die Dateipfade durch den Speicherort, an dem Sie die Ausgabe speichern möchten. Wenn Sie das Dateiziel angeben, müssen Sie einen Dateipfad für die Protokolldatei sowie die Metadatendatei angeben.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
So zeigen Sie die Ergebnisse an
Sie können die Ausgabe mithilfe der sys.fn_xe_file_target_read_file-Funktion anzeigen. Führen Sie hierzu die folgende Abfrage aus, und ersetzen Sie dabei die Dateipfade durch die angegebenen Pfade:
SELECT *, CAST(event_data as XML) AS 'event_data_XML' FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);
Hinweis Die Umwandlung der Ereignisdaten in XML ist optional.
Weitere Informationen zur sys.fn_xe_file_target_read_file-Funktion finden Sie unter sys.fn_xe_file_target_read_file (Transact-SQL).
Beispiel
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')
DROP EVENT SESSION [session_name] ON SERVER;
CREATE EVENT SESSION [session_name]
ON SERVER
ADD EVENT sqlserver.sp_statement_starting
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59
),
ADD EVENT sqlserver.sp_statement_completed
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59 AND duration > 0
)
ADD TARGET package0.asynchronous_file_target
(SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Siehe auch
Konzepte
Anzeigen der Entsprechungen von erweiterten Ereignissen für SQL-Ablaufverfolgungsklassen