Delen via


Een bestaand SQL-traceringsscript converteren naar een sessie met uitgebreide gebeurtenissen

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Als u een bestaand SQL Trace-script hebt dat u wilt converteren naar een sessie met uitgebreide gebeurtenissen, kunt u de procedures in dit onderwerp gebruiken om een equivalente uitgebreide gebeurtenissensessie te maken. Met behulp van de informatie in de trace_xe_action_map- en trace_xe_event_map systeemtabellen kunt u de informatie verzamelen die u nodig hebt om de conversie uit te voeren.

De stappen omvatten het volgende:

  1. Voer het bestaande script uit om een SQL Trace-sessie te maken en haal vervolgens de id van de tracering op.

  2. Voer een query uit die gebruikmaakt van de fn_trace_geteventinfo-functie om de overeenkomstige Extended Events-gebeurtenissen en -acties voor elke SQL Trace-gebeurtenisklasse en de bijbehorende kolommen te vinden.

  3. Gebruik de functie fn_trace_getfilterinfo om de filters en de equivalente acties voor uitgebreide gebeurtenissen weer te geven die moeten worden gebruikt.

  4. Maak handmatig een Extended Events-sessie aan, met gebruik van de equivalente Extended Events-gebeurtenissen, -acties en -predicaten (filters).

Om de trace-ID te verkrijgen

  1. Open het SQL Trace-script in Query-editor en voer vervolgens het script uit om de traceringssessie te maken. Houd er rekening mee dat de traceringssessie niet hoeft te worden uitgevoerd om deze procedure te voltooien.

  2. Haal de ID van de trace op. Gebruik hiervoor de volgende query:

    SELECT * FROM sys.traces;  
    GO  
    

    Opmerking

    Trace-id 1 geeft doorgaans de standaardtracering aan.

De equivalenten voor uitgebreide gebeurtenissen bepalen

  1. Als u de equivalente gebeurtenissen en acties voor uitgebreide gebeurtenissen wilt bepalen, voert u de volgende query uit, waarbij trace_id is ingesteld op de waarde van de tracerings-id die u in de vorige procedure hebt verkregen.

    Opmerking

    In dit voorbeeld wordt de tracerings-id voor de standaardtracering (1) gebruikt.

    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;  
    

    De equivalente gebeurtenis-id voor uitgebreide gebeurtenissen, pakketnaam, gebeurtenisnaam, kolom-id en actienaam worden geretourneerd. U gebruikt deze uitvoer in de procedure 'Een sessie voor uitgebreide gebeurtenissen maken' verderop in dit onderwerp.

    In sommige gevallen wordt de gefilterde kolom toegewezen aan een gebeurtenisgegevensveld dat standaard is opgenomen in de gebeurtenis Uitgebreide gebeurtenissen. Daarom is de kolom 'Extended_Events_action_name' NULL. Als dit gebeurt, moet u het volgende doen om te bepalen welk gegevensveld gelijk is aan de gefilterde kolom:

    1. Voor de acties die NULL retourneren, identificeert u welke SQL Trace-gebeurtenisklassen in het script de kolom bevatten die wordt gefilterd.

      U hebt bijvoorbeeld de gebeurtenisklasse SP:StmtCompleted gebruikt en een filter opgegeven voor de naam van de duurtraceringskolom (SQL Trace-gebeurtenisklasse-id 45 en SQL Trace-kolom-id 13). In dit geval wordt de actienaam weergegeven als NULL in de queryresultaten.

    2. Voor elke SQL Trace-gebeurtenisklasse die u in de vorige stap hebt geïdentificeerd, zoekt u de equivalente gebeurtenisnaam voor uitgebreide gebeurtenissen. (Als u niet zeker weet van de equivalente gebeurtenisnaam, gebruikt u de query in het onderwerp De uitgebreide gebeurtenissen die equivalenten zijn voor SQL Trace Event Classes weergeven.)

    3. Gebruik de volgende query om de juiste gegevensvelden te identificeren die moeten worden gebruikt voor de gebeurtenissen die u in de vorige stap hebt geïdentificeerd. De query toont de gegevensvelden van de uitgebreide gebeurtenissen in de kolom 'event_field'. Vervang <in de query event_name> door de naam van een gebeurtenis die u in de vorige stap hebt opgegeven.

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

      De gebeurtenisklasse SP:StmtCompleted wordt bijvoorbeeld toegewezen aan de uitgebreide gebeurtenis sp_statement_completed. Als u sp_statement_completed opgeeft als de gebeurtenisnaam in de query, worden in de kolom event_field de velden weergegeven die standaard zijn opgenomen in de gebeurtenis. Als u de velden bekijkt, ziet u dat er een "duur" veld is. Als u het filter wilt maken in de equivalente sessie met uitgebreide gebeurtenissen, voegt u een predicaat toe, zoals WHERE duration > 0. Voor een voorbeeld kunt u de procedure "To create the Extended Events session" in dit onderwerp raadplegen.

Om de sessie Uitgebreide Gebeurtenissen te maken

Gebruik De Query-editor om de sessie Uitgebreide gebeurtenissen te maken en de uitvoer naar een bestandsdoel te schrijven. In de volgende stappen wordt één query beschreven, met uitleg over het bouwen van de query. Zie de sectie 'Voorbeeld' van dit onderwerp voor het volledige queryvoorbeeld.

  1. Voeg instructies toe om de gebeurtenissessie te maken, waarbij session_name vervangt door de naam die u wilt gebruiken voor de sessie Uitgebreide Gebeurtenissen.

    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. Voeg de uitgebreide gebeurtenissen en acties toe die zijn geretourneerd als uitvoer in de procedure 'De equivalenten voor uitgebreide gebeurtenissen bepalen' en voeg de predicaten (filters) toe die u hebt geïdentificeerd in de procedure 'De filters bepalen die in het script zijn gebruikt'.

    In het volgende voorbeeld wordt een SQL Trace-script gebruikt dat de gebeurtenisklassen SQL:StmtStarting en SP:StmtCompleted bevat, met filters voor sessie-id en duur. Voorbeelduitvoer voor de query in de procedure 'De equivalenten voor uitgebreide gebeurtenissen bepalen' heeft de volgende resultatenset geretourneerd:

    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  
    

    Als u dit wilt converteren naar het equivalent van uitgebreide gebeurtenissen, worden de sqlserver.sp_statement_starting en de sqlserver.sp_statement_completed gebeurtenissen toegevoegd, met een lijst met acties. Predicaatuitdrukkingen worden opgenomen als WHERE-clausules.

    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. Voeg het asynchrone bestandsdoel toe, waarbij u de bestandspaden vervangt door de locatie waar u de uitvoer wilt opslaan. Wanneer u het bestandsdoel opgeeft, moet u een logboekbestand en bestandspadbestand voor metagegevens opnemen.

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

De resultaten weergeven

  1. U kunt de functie sys.fn_xe_file_target_read_file gebruiken om de uitvoer weer te geven. Voer hiervoor de volgende query uit, waarbij u de bestandspaden vervangt door de paden die u hebt opgegeven:

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

    Opmerking

    Het casten van de gebeurtenisgegevens als XML is optioneel.

    Zie sys.fn_xe_file_target_read_file (Transact-SQL) voor meer informatie over de functie sys.fn_xe_file_target_read_file.

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

Zie ook

De uitgebreide gebeurtenissen die equivalenten zijn van SQL Trace-gebeurtenisklassen weergeven