Udostępnij za pomocą


Konwertowanie istniejącego skryptu śledzenia SQL na sesję zdarzeń rozszerzonych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Jeśli masz istniejący skrypt śledzenia SQL, który chcesz przekonwertować na sesję zdarzeń rozszerzonych, możesz użyć procedur w tym temacie, aby utworzyć równoważną sesję zdarzeń rozszerzonych. Korzystając z informacji w tabelach systemowych trace_xe_action_map i trace_xe_event_map, można zebrać niezbędne dane do przeprowadzenia konwersji.

Kroki obejmują następujące czynności:

  1. Wykonaj istniejący skrypt, aby utworzyć sesję śledzenia SQL, a następnie uzyskaj identyfikator śledzenia.

  2. Uruchom zapytanie, które używa funkcji fn_trace_geteventinfo w celu znalezienia równoważnych zdarzeń rozszerzonych i akcji dla każdej klasy zdarzeń śledzenia SQL i skojarzonych kolumn.

  3. Użyj funkcji fn_trace_getfilterinfo, aby wyświetlić listę filtrów oraz odpowiednich akcji dla Zdarzeń rozszerzonych do zastosowania.

  4. Ręcznie utwórz sesję zdarzeń rozszerzonych przy użyciu równoważnych zdarzeń rozszerzonych, akcji i predykatów (filtrów).

Aby uzyskać identyfikator śledzenia

  1. Otwórz skrypt śledzenia SQL w Edytorze zapytań, a następnie wykonaj skrypt, aby utworzyć sesję śledzenia. Pamiętaj, że sesja śledzenia nie musi być uruchomiona, aby wykonać tę procedurę.

  2. Uzyskaj identyfikator śledzenia. W tym celu użyj następującego zapytania:

    SELECT * FROM sys.traces;  
    GO  
    

    Uwaga / Notatka

    Identyfikator śledzenia 1 zwykle wskazuje domyślny ślad.

Aby określić odpowiedniki Rozszerzonych Zdarzeń

  1. Aby określić równoważne zdarzenia rozszerzone i akcje, uruchom następujące zapytanie, w którym trace_id jest ustawiona na wartość identyfikatora śledzenia uzyskanego w poprzedniej procedurze.

    Uwaga / Notatka

    W tym przykładzie używany jest identyfikator śledzenia dla domyślnego śladu (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;  
    

    Zwracany jest równoważny identyfikator zdarzenia rozszerzonego, nazwa pakietu, nazwa zdarzenia, identyfikator kolumny i nazwa akcji. Tego wyniku użyjesz w procedurze "Tworzenie sesji zdarzeń rozszerzonych" w dalszej części tematu.

    W niektórych przypadkach filtrowana kolumna jest mapowana na pole danych zdarzenia, które jest domyślnie uwzględniane w zdarzeniu Zdarzenia rozszerzone. W związku z tym kolumna "Extended_Events_action_name" będzie mieć wartość NULL. W takim przypadku należy wykonać następujące czynności, aby określić, które pole danych jest równoważne z filtrowaną kolumną:

    1. W przypadku akcji, które zwracają wartość NULL, zidentyfikuj klasy zdarzeń śledzenia SQL w skrycie zawierającej filtrowaną kolumnę.

      Na przykład, można było użyć klasy zdarzeń SP:StmtCompleted oraz określić filtr dla kolumny śladu Czas trwania (identyfikator klasy zdarzeń SQL Trace 45 oraz identyfikator kolumny śladu SQL Trace 13). W takim przypadku nazwa akcji będzie wyświetlana jako NULL w wynikach zapytania.

    2. Dla każdej klasy zdarzeń śledzenia SQL zidentyfikowanych w poprzednim kroku znajdź równoważną nazwę zdarzenia rozszerzonego. (Jeśli nie masz pewności co do równoważnej nazwy zdarzenia, użyj zapytania w temacie Wyświetl rozszerzone zdarzenia równoważne klasom zdarzeń śledzenia SQL).

    3. Użyj następującego zapytania, aby zidentyfikować poprawne pola danych do użycia dla zdarzeń zidentyfikowanych w poprzednim kroku. Zapytanie wyświetla pola danych Extended Events w kolumnie zatytułowanej "event_field". W zapytaniu zastąp <event_name> nazwą zdarzenia określonego w poprzednim kroku.

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

      Na przykład klasa zdarzeń SP:StmtCompleted odpowiada zdarzeniu Extended Events sp_statement_completed. Jeśli określisz sp_statement_completed jako nazwę zdarzenia w zapytaniu, w kolumnie "event_field" zostaną wyświetlone pola, które są domyślnie dołączone do zdarzenia. Patrząc na pola, widać, że istnieje pole "czas trwania". Aby utworzyć filtr w równoważnej sesji zdarzeń rozszerzonych, należy dodać predykat, taki jak "WHERE duration > 0". Aby zapoznać się z przykładem, zobacz procedurę "Aby utworzyć sesję Extended Events" w tym temacie.

Aby utworzyć sesję zdarzeń rozszerzonych

Użyj edytora zapytań, aby utworzyć sesję zdarzeń rozszerzonych i zapisać dane wyjściowe w obiekcie docelowym pliku. W poniższych krokach opisano pojedyncze zapytanie z wyjaśnieniami, aby pokazać, jak utworzyć zapytanie. Pełny przykład zapytania można znaleźć w sekcji "Przykład" tego tematu.

  1. Dodaj instrukcje, aby utworzyć sesję zdarzeń, zastępując session_name nazwą, której chcesz użyć dla sesji zdarzeń rozszerzonych.

    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. Dodaj zdarzenia i akcje Extended Events, które zostały zwrócone jako dane wyjściowe w procedurze "Określanie odpowiedników zdarzeń rozszerzonych", oraz dodaj predykaty (filtry), które zidentyfikowałeś w procedurze "Określanie filtrów użytych w skrypcie".

    W poniższym przykładzie użyto skryptu śledzenia SQL, który zawiera klasy zdarzeń SQL:StmtStarting i SP:StmtCompleted z filtrami dla identyfikatora sesji i czasu trwania. Przykładowe dane wyjściowe zapytania w procedurze "Określanie odpowiedników zdarzeń rozszerzonych" zwróciły następujący zestaw wyników:

    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  
    

    Aby przekonwertować je na odpowiednik zdarzeń rozszerzonych, dodawane są zdarzenia sqlserver.sp_statement_starting i sqlserver.sp_statement_completed z listą akcji. Wyrażenia predykatu są uwzględniane jako klauzule WHERE.

    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. Dodaj obiekt docelowy pliku asynchronicznego, zastępując ścieżki plików lokalizacją, w której chcesz zapisać dane wyjściowe. Podczas określania miejsca docelowego pliku należy dołączyć plik dziennika i plik ścieżki pliku metadanych.

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

Aby wyświetlić wyniki

  1. Aby wyświetlić dane wyjściowe, możesz użyć funkcji sys.fn_xe_file_target_read_file. W tym celu uruchom następujące zapytanie, zastępując ścieżki plików określonymi ścieżkami:

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

    Uwaga / Notatka

    Rzutowanie danych zdarzenia jako XML jest opcjonalne.

    Aby uzyskać więcej informacji na temat funkcji sys.fn_xe_file_target_read_file, zobacz 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');  

Zobacz też

Wyświetlanie zdarzeń rozszerzonych równoważnych z klasami zdarzeń śledzenia SQL