다음을 통해 공유


기존 SQL 추적 스크립트를 확장 이벤트 세션으로 변환

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

확장 이벤트 세션으로 변환할 기존 SQL 추적 스크립트가 있는 경우 이 항목의 절차를 따라 해당하는 확장 이벤트 세션을 만들 수 있습니다. trace_xe_action_map 및 trace_xe_event_map 시스템 테이블의 정보를 사용하여 변환을 수행해야 하는 정보를 수집할 수 있습니다.

단계는 다음과 같습니다.

  1. 기존 스크립트를 실행하여 SQL 추적 세션을 만든 다음 추적의 ID를 가져옵니다.

  2. fn_trace_geteventinfo 함수를 사용하는 쿼리를 실행하여 각 SQL 추적 이벤트 클래스와 관련 열에 해당하는 확장 이벤트의 이벤트 및 동작을 찾습니다.

  3. fn_trace_getfilterinfo 함수를 사용하여 필터 및 사용할 해당 확장 이벤트 작업을 나열합니다.

  4. 해당하는 확장 이벤트의 이벤트, 작업 및 조건자(필터)를 사용하여 확장 이벤트 세션을 수동으로 만듭니다.

추적 ID 가져오기

  1. 쿼리 편집기에서 SQL 추적 스크립트를 연 다음, 스크립트를 실행하여 추적 세션을 만듭니다. 이 절차를 완료하기 위해 추적 세션을 실행할 필요가 없습니다.

  2. 추적 ID를 확인합니다. 이를 수행하려면 다음 쿼리를 사용합니다.

    SELECT * FROM sys.traces;  
    GO  
    

    참고 항목

    추적 ID 1은 일반적으로 기본 추적을 나타냅니다.

해당하는 확장 이벤트 확인하기

  1. 해당하는 확장 이벤트의 이벤트 및 작업을 확인하려면 다음 쿼리를 실행합니다. 여기서 trace_id는 이전 절차에서 얻은 추적 ID 값으로 설정됩니다.

    참고 항목

    이 예에서는 기본 추적의 추적 ID(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;  
    

    해당하는 확장 이벤트의 이벤트 ID, 패키지 이름, 이벤트 이름, 열 ID 및 동작 이름이 반환됩니다. 이 출력은 이 항목의 뒷부분에 있는 "확장 이벤트 세션 만들기" 절차에서 사용합니다.

    경우에 따라 필터링된 열은 확장 이벤트의 이벤트에 기본적으로 포함된 이벤트 데이터 필드에 매핑됩니다. 따라서 "Extended_Events_action_name" 열은 NULL이 됩니다. 이 경우 필터링된 열에 해당하는 데이터 필드를 확인하려면 다음을 수행해야 합니다.

    1. NULL을 반환하는 동작의 경우 스크립트에서 필터링되는 열을 포함하는 SQL 추적 이벤트 클래스를 확인합니다.

      예를 들어 SP:StmtCompleted 이벤트 클래스를 사용하고 Duration 추적 열 이름(SQL 추적 이벤트 클래스 ID 45 및 SQL 추적 열 ID 13)에 필터를 지정했을 수 있습니다. 이 경우 쿼리 결과에 작업 이름이 NULL로 표시됩니다.

    2. 이전 단계에서 식별한 각 SQL 추적 이벤트 클래스에 대해 해당하는 확장 이벤트의 이벤트 이름을 찾습니다. (해당하는 이벤트 이름을 잘 모르는 경우 SQL 추적 이벤트 클래스에 해당하는 확장 이벤트 보기 항목의 쿼리를 사용합니다.)

    3. 다음 쿼리를 사용하여 이전 단계에서 식별한 이벤트에 사용할 올바른 데이터 필드를 식별합니다. 쿼리는 "event_field" 열의 확장 이벤트 데이터 필드를 보여 줍니다. 쿼리에서 <>을 이전 단계에서 지정한 이벤트의 이름으로 바꿉니다.

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

      예를 들어 SP:StmtCompleted 이벤트 클래스는 sp_statement_completed 확장 이벤트의 이벤트에 매핑됩니다. 쿼리에서 sp_statement_completed를 이벤트 이름으로 지정하면 "event_field" 열에 기본적으로 이벤트에 포함된 필드가 표시됩니다. 필드를 보면 "duration" 필드가 있음을 알 수 있습니다. 해당하는 확장 이벤트 세션에 필터를 만들려면 "WHERE duration > 0"과 같은 조건자를 추가합니다. 예를 들어 이 항목의 "확장 이벤트 세션 만들기" 절차를 참조하세요.

확장 이벤트 세션을 만들려면

쿼리 편집기 사용하여 확장 이벤트 세션을 만들고 파일 대상에 출력을 씁니다. 다음 단계에서는 쿼리를 작성하는 방법을 보여주는 설명과 함께 단일 쿼리에 대해 설명합니다. 전체 쿼리 예제는 이 항목의 "예제" 섹션을 참조하세요.

  1. 다음과 같이 이벤트 세션을 만드는 문을 추가합니다. session_name을 확장 이벤트 세션에 사용할 이름으로 바꿉니다.

    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. "확장 이벤트의 해당 항목을 확인하려면" 절차에서 출력으로 반환된 확장 이벤트의 이벤트 및 동작을 추가하고 "스크립트에 사용된 필터를 확인하려면" 절차에서 확인한 조건자(필터)를 추가합니다.

    다음 예제에서는 세션 ID 및 기간에 대한 필터와 함께 SQL:StmtStarting 및 SP:StmtCompleted 이벤트 클래스를 포함하는 SQL 추적 스크립트를 사용합니다. "해당하는 확장 이벤트 확인" 절차의 쿼리에 대한 샘플 출력은 다음 결과 집합을 반환했습니다.

    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  
    

    이를 해당하는 확장 이벤트로 변환하기 위해 작업 목록과 함께 sqlserver.sp_statement_starting 및 sqlserver.sp_statement_completed 이벤트가 추가됩니다. 조건자 문은 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. 파일 경로를 출력을 저장할 위치로 바꿔 비동기 파일 대상을 추가합니다. 파일 대상을 지정할 때 로그 파일 및 메타데이터 파일 경로 파일을 포함해야 합니다.

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

결과를 보려면

  1. sys.fn_xe_file_target_read_file 함수를 사용하여 출력을 볼 수 있습니다. 이를 수행하려면 다음 쿼리를 실행하여 파일 경로를 지정한 경로로 바꿉니다.

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

    참고 항목

    이벤트 데이터를 XML로 캐스팅하는 것은 선택 사항입니다.

    sys.fn_xe_file_target_read_file 함수에 대한 자세한 내용은 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');  
    

예시

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

참고 항목

SQL 추적 이벤트 클래스에 해당하는 확장 이벤트 보기