Konvertera ett befintligt SQL-spårningsskript till en utökad händelsesession

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Om du har ett befintligt SQL Trace-skript som du vill konvertera till en extended events-session kan du använda procedurerna i det här avsnittet för att skapa en motsvarande extended events-session. Genom att använda informationen i trace_xe_action_map- och trace_xe_event_map-systemtabellerna kan du samla in den information som du måste ha för konverteringen.

Stegen omfattar följande:

  1. Kör det befintliga skriptet för att skapa en SQL Trace-session och hämta sedan ID:t för spårningen.

  2. Kör en fråga som använder funktionen fn_trace_geteventinfo för att hitta motsvarande händelser och åtgärder för extended events för varje SQL Trace-händelseklass och dess associerade kolumner.

  3. Använd funktionen fn_trace_getfilterinfo för att lista filtren och motsvarande åtgärder för utökade händelser som ska användas.

  4. Skapa en Extended Events-session manuellt med hjälp av motsvarande Extended Events-händelser, åtgärder och predikat (filter).

Hämta spårnings-ID:t

  1. Öppna SQL Trace-skriptet i Frågeredigeraren och kör sedan skriptet för att skapa spårningssessionen. Observera att spårningssessionen inte behöver köras för att slutföra den här proceduren.

  2. Hämta ID:t för spårningen. Använd följande fråga för att göra detta:

    SELECT * FROM sys.traces;  
    GO  
    

    Anmärkning

    Spårnings-ID 1 anger vanligtvis standardspårningen.

För att fastställa motsvarigheterna till Extended Events

  1. För att fastställa motsvarande händelser och åtgärder för utökade händelser kör du följande fråga, där trace_id anges till värdet för det spårnings-ID som du fick i föregående procedur.

    Anmärkning

    I det här exemplet används spårnings-ID:t för standardspårningen (1).

    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;  
    

    Motsvarande händelse-ID för Extended Events, paketnamn, händelsenamn, kolumn-ID och åtgärdsnamn returneras. Du kommer att använda dessa utdata i proceduren "För att skapa sessionen Utökade händelser" senare i det här avsnittet.

    I vissa fall mappas den filtrerade kolumnen till ett händelsedatafält som ingår som standard i händelsen Extended Events. Därför är kolumnen "Extended_Events_action_name" NULL. Om detta inträffar måste du göra följande för att avgöra vilket datafält som motsvarar den filtrerade kolumnen:

    1. För de åtgärder som returnerar NULL identifierar du vilka SQL Trace-händelseklasser i skriptet som innehåller kolumnen som filtreras.

      Du kan till exempel ha använt händelseklassen SP:StmtCompleted och angett ett filter för kolumnnamnet Varaktighetsspårning (SQL Trace-händelseklass-ID 45 och SQL Trace-kolumn-ID 13). I det här fallet visas åtgärdsnamnet som NULL i frågeresultatet.

    2. För varje SQL Trace-händelseklass som du identifierade i föregående steg letar du reda på motsvarande händelsenamn för Extended Events. (Om du inte är säker på motsvarande händelsenamn använder du frågan i ämnet Visa motsvarigheter för Extended Events till SQL Trace Event Classes.)

    3. Använd följande fråga för att identifiera rätt datafält som ska användas för de händelser som du identifierade i föregående steg. Frågan visar datafälten Extended Events i kolumnen "event_field". I frågan ersätter <du event_name> med namnet på en händelse som du angav i föregående steg.

      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>';  
      

      Till exempel mappar händelseklassen SP:StmtCompleted till händelsen sp_statement_completed Extended Events. Om du anger sp_statement_completed som händelsenamn i frågan visar kolumnen "event_field" de fält som ingår som standard med händelsen. När du tittar på fälten kan du se att det finns ett "varaktighetsfält". Om du vill skapa filtret i motsvarande extended events-session lägger du till ett predikat som "WHERE duration > 0". Ett exempel finns i proceduren "För att skapa sessionen Utökade händelser" i det här avsnittet.

Så här skapar du sessionen Extended Events

Använd Frågeredigeraren för att skapa sessionen Utökade händelser och för att skriva utdata till ett filmål. Följande steg beskriver en enskild fråga med förklaringar som visar hur du skapar frågan. Det fullständiga frågeexemplet finns i avsnittet "Exempel" i det här avsnittet.

  1. Lägg till instruktioner för att skapa händelsesessionen och ersätt session_name med det namn som du vill använda för sessionen Extended Events.

    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;  
    
  2. Lägg till händelser och åtgärder för utökade händelser som returnerades som utdata i proceduren "Fastställa motsvarande utökade händelser" och lägg till de predikat (filter) som du identifierade i proceduren "För att fastställa de filter som användes i skriptet".

    I följande exempel används ett SQL Trace-skript som innehåller händelseklasserna SQL:StmtStarting och SP:StmtCompleted, med filter för sessions-ID och varaktighet. Exempelutdata för frågan i proceduren "Determine the Extended Events equivalents" returnerade följande resultatuppsättning:

    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  
    

    Om du vill konvertera detta till motsvarande extended events läggs sqlserver.sp_statement_starting och sqlserver.sp_statement_completed händelser till, med en lista över åtgärder. Predikat ingår som WHERE-satser.

    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  
       )  
    
  3. Lägg till det asynkrona filmålet och ersätt filsökvägarna med den plats där du vill spara utdata. När du anger filmålet måste du inkludera en loggfil och en sökvägsfil för metadatafiler.

    ADD TARGET package0.asynchronous_file_target(  
       SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Så här visar du resultatet

  1. Du kan använda funktionen sys.fn_xe_file_target_read_file för att visa utdata. Det gör du genom att köra följande fråga och ersätta filsökvägarna med de sökvägar som du har angett:

    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);  
    
    

    Anmärkning

    Det är valfritt att konvertera händelsedata som XML.

    Mer information om funktionen sys.fn_xe_file_target_read_file finns i sys.fn_xe_file_target_read_file (Transact-SQL).

    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');  
    

Example

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');  

Se även

Visa ekvivalenter för utökade händelser till SQL Trace Event-klasser