기존 SQL 추적 스크립트를 확장 이벤트 세션으로 변환
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
확장 이벤트 세션으로 변환할 기존 SQL 추적 스크립트가 있는 경우 이 항목의 절차를 따라 해당하는 확장 이벤트 세션을 만들 수 있습니다. trace_xe_action_map 및 trace_xe_event_map 시스템 테이블의 정보를 사용하여 변환을 수행해야 하는 정보를 수집할 수 있습니다.
단계는 다음과 같습니다.
기존 스크립트를 실행하여 SQL 추적 세션을 만든 다음 추적의 ID를 가져옵니다.
fn_trace_geteventinfo 함수를 사용하는 쿼리를 실행하여 각 SQL 추적 이벤트 클래스와 관련 열에 해당하는 확장 이벤트의 이벤트 및 동작을 찾습니다.
fn_trace_getfilterinfo 함수를 사용하여 필터 및 사용할 해당 확장 이벤트 작업을 나열합니다.
해당하는 확장 이벤트 이벤트, 작업 및 조건자(필터)를 사용하여 확장 이벤트 세션을 수동으로 만듭니다.
추적 ID를 가져오려면
쿼리 편집기에서 SQL 추적 스크립트를 연 다음, 스크립트를 실행하여 추적 세션을 만듭니다. 이 절차를 완료하기 위해 추적 세션을 실행할 필요가 없습니다.
추적 ID를 확인합니다. 이렇게 하려면 다음 쿼리를 사용합니다.
SELECT * FROM sys.traces; GO
참고 항목
추적 ID 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이 됩니다. 이 경우 필터링된 열과 동일한 데이터 필드를 확인하려면 다음을 수행해야 합니다.
NULL을 반환하는 동작의 경우 스크립트에서 필터링되는 열을 포함하는 SQL 추적 이벤트 클래스를 확인합니다.
예를 들어 SP:StmtCompleted 이벤트 클래스를 사용하고 Duration 추적 열 이름(SQL Trace 이벤트 클래스 ID 45 및 SQL Trace 열 ID 13)에 필터를 지정했을 수 있습니다. 이 경우 쿼리 결과에 작업 이름이 NULL로 표시됩니다.
이전 단계에서 식별한 각 SQL Trace 이벤트 클래스에 대해 해당하는 확장 이벤트 이벤트 이름을 찾습니다. (해당하는 이벤트 이름을 잘 모르는 경우 항목 의 쿼리를 사용합니다.SQL 추적 이벤트 클래스에 해당하는 확장 이벤트를 봅니다.)
다음 쿼리를 사용하여 이전 단계에서 식별한 이벤트에 사용할 올바른 데이터 필드를 식별합니다. 쿼리는 "event_field" 열의 확장 이벤트 데이터 필드를 보여 줍니다. 쿼리에서 event_name> 이전 단계에서 지정한 이벤트의 이름으로 바꿉<습니다.
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" 열에 기본적으로 이벤트에 포함된 필드가 표시됩니다. 필드를 보면 "기간" 필드가 있음을 알 수 있습니다. 해당하는 확장 이벤트 세션에서 필터를 만들려면 "WHERE 기간 > 0"과 같은 조건자를 추가합니다. 예를 들어 이 항목의 "확장 이벤트 세션을 만들려면" 절차를 참조하세요.
확장 이벤트 세션을 만들려면
쿼리 편집기를 사용하여 확장 이벤트 세션을 만들고 파일 대상에 출력을 씁니다. 다음 단계에서는 쿼리를 작성하는 방법을 보여 줄 설명과 함께 단일 쿼리에 대해 설명합니다. 전체 쿼리 예제는 이 항목의 "예제" 섹션을 참조하세요.
다음과 같이 이벤트 세션을 만드는 문을 추가합니다. 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;
"확장 이벤트의 해당 항목을 확인하려면" 절차에서 출력으로 반환된 확장 이벤트의 이벤트 및 동작을 추가하고 "스크립트에 사용된 필터를 확인하려면" 절차에서 확인한 조건자(필터)를 추가합니다.
다음 예제에서는 세션 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 )
파일 경로를 출력을 저장할 위치로 바꿔 비동기 파일 대상을 추가합니다. 파일 대상을 지정할 때 로그 파일 및 메타데이터 파일 경로 파일을 포함해야 합니다.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
결과를 보려면
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');
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기