CREATE EVENT SESSION(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
이벤트 원본, 이벤트 세션 대상 및 이벤트 세션 옵션을 식별하는 확장 이벤트 세션을 만듭니다.
구문
CREATE EVENT SESSION event_session_name
ON { SERVER | DATABASE }
{
<event_definition> [ ,...n]
[ <event_target_definition> [ ,...n] ]
[ WITH ( <event_session_options> [ ,...n] ) ]
}
;
<event_definition>::=
{
ADD EVENT [event_module_guid].event_package_name.event_name
[ ( {
[ SET { event_customizable_attribute = <value> [ ,...n] } ]
[ ACTION ( { [event_module_guid].event_package_name.action_name [ ,...n] } ) ]
[ WHERE <predicate_expression> ]
} ) ]
}
<predicate_expression> ::=
{
[ NOT ] <predicate_factor> | {( <predicate_expression> ) }
[ { AND | OR } [ NOT ] { <predicate_factor> | ( <predicate_expression> ) } ]
[ ,...n ]
}
<predicate_factor>::=
{
<predicate_leaf> | ( <predicate_expression> )
}
<predicate_leaf>::=
{
<predicate_source_declaration> { = | < > | ! = | > | > = | < | < = } <value>
| [event_module_guid].event_package_name.predicate_compare_name ( <predicate_source_declaration>, <value> )
}
<predicate_source_declaration>::=
{
event_field_name | ( [event_module_guid].event_package_name.predicate_source_name )
}
<value>::=
{
number | 'string'
}
<event_target_definition>::=
{
ADD TARGET [event_module_guid].event_package_name.target_name
[ ( SET { target_parameter_name = <value> [ ,...n] } ) ]
}
<event_session_options>::=
{
[ MAX_MEMORY = size [ KB | MB ] ]
[ [,] EVENT_RETENTION_MODE = { ALLOW_SINGLE_EVENT_LOSS | ALLOW_MULTIPLE_EVENT_LOSS | NO_EVENT_LOSS } ]
[ [,] MAX_DISPATCH_LATENCY = { seconds SECONDS | INFINITE } ]
[ [,] MAX_EVENT_SIZE = size [ KB | MB ] ]
[ [,] MEMORY_PARTITION_MODE = { NONE | PER_NODE | PER_CPU } ]
[ [,] TRACK_CAUSALITY = { ON | OFF } ]
[ [,] STARTUP_STATE = { ON | OFF } ]
}
인수
event_session_name
이벤트 세션에 대한 사용자 정의 이름입니다. event_session_name은 영숫자로 최대 128자를 사용할 수 있으며 SQL Server의 인스턴스 내에서 중복되지 않아야 하고 식별자에 대한 규칙을 따라야 합니다.
ADD EVENT [ event_module_guid ].event_package_name.event_name
이벤트 세션과 연결할 이벤트입니다. 여기서 각 매개 변수의 의미는 다음과 같습니다.
- event_module_guid는 이벤트가 포함된 모듈의 GUID입니다.
- event_package_name은 동작 개체가 포함된 패키지입니다.
- event_name은 이벤트 개체입니다.
이벤트는 sys.dm_xe_objects
뷰에 object_type 'event'로 표시됩니다.
SET { event_customizable_attribute= <value> [ ,...n] }
이벤트의 사용자 지정 가능한 특성을 설정합니다. 사용자 지정 가능한 특성은 sys.dm_xe_object_columns
뷰에 column_type 'customizable' 및 object_name = event_name으로 표시됩니다.
ACTION ( { [event_module_guid].event_package_name.action_name [ ,...n] })
이벤트 세션과 연결할 동작입니다. 여기서 각 매개 변수의 의미는 다음과 같습니다.
- event_module_guid는 이벤트가 포함된 모듈의 GUID입니다.
- event_package_name은 동작 개체가 포함된 패키지입니다.
- action_name은 동작 개체입니다.
동작은 sys.dm_xe_objects
뷰에 object_type 'action'으로 표시됩니다.
WHERE <predicate_expression>
이벤트 처리 여부를 확인하는 데 사용할 조건자 식을 지정합니다. <predicate_expression>이 true일 경우 이벤트가 세션에 대한 동작과 대상에 의해 추가로 처리됩니다. predicate_expression> false이면 <추가 작업 및 대상 처리를 방지하여 이벤트가 삭제됩니다. 조건자 식은 3,000자로 제한됩니다.
event_field_name 조건자 원본을 식별하는 이벤트 필드의 이름입니다.
[event_module_guid].event_package_name.predicate_source_name 전역 조건자 원본의 이름입니다. 여기서 각 매개 변수의 의미는 다음과 같습니다.
- event_module_guid는 이벤트가 포함된 모듈의 GUID입니다.
- event_package_name은 조건자 개체가 포함된 패키지입니다.
- predicate_source_name은
sys.dm_xe_objects
뷰에서object_type
'pred_source'로 정의됩니다.
[event_module_guid].event_package_name.predicate_compare_name 이벤트와 연결할 조건자 개체의 이름입니다. 여기서 각 매개 변수의 의미는 다음과 같습니다.
- event_module_guid는 이벤트가 포함된 모듈의 GUID입니다.
- event_package_name은 조건자 개체가 포함된 패키지입니다.
- predicate_compare_name은
sys.dm_xe_objects
뷰에서object_type
'pred_compare'로 정의된 전역 원본입니다.
numberdecimal 을 포함한 모든 숫자 유형입니다. 단, 사용 가능한 실제 메모리가 부족한 경우나 값이 너무 커서 64비트 정수로 표현할 수 없는 숫자는 제외됩니다.
'string' 조건자 비교에 필요한 ANSI 또는 유니코드 문자열입니다. 조건자 비교 함수에 대해서는 암시적 문자열 유형 변환이 수행되지 않습니다. 잘못된 유형을 전달하면 오류가 발생합니다.
ADD TARGET [event_module_guid].event_package_name.target_name
이벤트 세션과 연결할 대상입니다. 여기서 각 매개 변수의 의미는 다음과 같습니다.
- event_module_guid는 이벤트가 포함된 모듈의 GUID입니다.
- event_package_name은 동작 개체가 포함된 패키지입니다.
- target_name이 대상입니다. 대상은
sys.dm_xe_objects
뷰에object_type
'target'으로 표시됩니다.
SET { target_parameter_name= <value> [, ...n] }
대상 매개 변수를 설정합니다.
모든 대상 매개 변수 및 해당 설명을 보려면 다음 쿼리를 실행하여 자리 표시자를 대상 이름(예: 등ring_buffer
histogram
)으로 event_file
바꿉 target-name
니다.
SELECT name AS target_parameter_name,
column_value AS default_value,
description
FROM sys.dm_xe_object_columns
WHERE column_type = 'customizable'
AND
object_name = 'target-name';
Important
링 버퍼 대상을 사용하는 경우 XML 출력의 가능한 데이터 잘림을 방지하기 위해 대상 매개 변수(세션 매개 변수와 MAX_MEMORY
는 별개)를 1024KB(KB) 이하로 설정하는 MAX_MEMORY
것이 좋습니다.
대상 유형에 대한 자세한 내용은 SQL Server의 확장 이벤트 대상을 참조 하세요.
WITH ( <event_session_options> [ ,...n] )
이벤트 세션에 사용할 옵션을 지정합니다.
MAX_MEMORY =size [ KB | MB ]
이벤트 버퍼링을 위해 세션에 할당할 최대 메모리 양을 지정하며 기본값은 4MB입니다. size는 정수이며 KB 또는 MB 값일 수 있습니다. 최대 크기는 2GB(2,048MB 미만)를 초과할 수 없습니다. 그러나 GB 범위에서 메모리 값을 사용하는 것은 권장되지 않습니다.
EVENT_RETENTION_MODE = { ALLOW_SINGLE_EVENT_LOSS | ALLOW_MULTIPLE_EVENT_LOSS | NO_EVENT_LOSS }
이벤트 소실을 처리하는 데 사용할 이벤트 보존 모드를 지정합니다.
ALLOW_SINGLE_EVENT_LOSS 한 개의 이벤트가 세션에서 손실될 수 있습니다. 모든 이벤트 버퍼가 가득 찬 경우 한 개의 이벤트만 삭제됩니다. 이벤트 버퍼가 가득 찬 경우 이벤트 하나가 소실될 수 있도록 하면 SQL Server의 성능에 미치는 영향을 허용 범위 내로 유지하면서도 처리된 이벤트 스트림에서 데이터가 소실되는 것을 최소화할 수 있습니다.
ALLOW_MULTIPLE_EVENT_LOSS 여러 개의 이벤트를 포함하는 가득 찬 이벤트 버퍼가 세션에서 손실될 수 있습니다. 손실되는 이벤트 수는 세션에 할당된 메모리 크기, 메모리 분할 및 버퍼에 있는 이벤트의 크기에 따라 달라집니다. 이 옵션은 이벤트 버퍼가 빠른 속도로 채워질 때 서버에 미치는 성능 영향을 최소화하지만 많은 수의 이벤트가 세션에서 손실될 수 있습니다.
NO_EVENT_LOSS 이벤트 손실이 허용되지 않습니다. 이 옵션을 사용하면 발생한 모든 이벤트가 유지됩니다. 이벤트 버퍼에 사용 가능한 공간이 생길 때까지 이벤트를 발생시키는 모든 태스크가 대기합니다. NO_EVENT_LOSS 사용하면 이벤트 세션이 활성화된 동안 검색 가능한 성능 문제가 발생할 수 있습니다. 버퍼에서 이벤트가 플러시되기를 기다리는 동안 사용자 연결이 교착 상태에 빠질 수 있습니다.
참고 항목
2024년 6월부터 항상 최신 업데이트 정책을 사용하는 Azure SQL Database 및 Azure SQL Managed Instance의 이벤트 파일 대상에 대해 NO_EVENT_LOSS ALLOW_SINGLE_EVENT_LOSS 동일하게 동작합니다. NO_EVENT_LOSS, 메시지 ID 25665, 심각도 10 및 메시지 경고가 지정된 경우 이 대상은 NO_EVENT_LOSS 이벤트 보존 모드를 지원하지 않습니다. ALLOW_SINGLE_EVENT_LOSS 보존 모드가 대신 사용됩니다. 가 반환되고 세션이 만들어집니다.
이 변경은 Azure Blob Storage의 이벤트 파일 대상과 함께 NO_EVENT_LOSS 사용할 때 데이터베이스 가용성을 줄일 수 있는 연결 시간 제한, 장애 조치 지연 및 기타 문제를 방지합니다.
NO_EVENT_LOSS Azure SQL Database 및 Azure SQL Managed Instance에 대한 향후 업데이트에서 지원되는 EVENT_RETENTION_MODE 인수로 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
MAX_DISPATCH_LATENCY = { seconds SECONDS | INFINITE }
이벤트가 이벤트 세션 대상에 디스패치되기 전에 메모리에 버퍼링되는 시간을 지정합니다. 기본적으로 이 값은 30초로 설정됩니다.
seconds SECONDS 버퍼를 대상에 플러시하기 시작할 때까지 대기하는 초 단위 시간입니다. 초는 정수입니다. 최소 대기 시간 값은 1초입니다. 값으로 0을 사용하면 INFINITE 대기를 지정할 수 있습니다.
INFINITE 버퍼가 가득 차거나 이벤트 세션이 종료된 경우에만 버퍼를 대상에 플러시합니다.
참고
MAX_DISPATCH_LATENCY = 0 SECONDS는 MAX_DISPATCH_LATENCY = INFINITE와 같습니다.
MAX_EVENT_SIZE =size [ KB | MB ]
이벤트에 허용되는 최대 크기를 지정합니다. MAX_EVENT_SIZE MAX_MEMORY보다 큰 단일 이벤트만 허용하도록 설정해야 합니다. MAX_MEMORY 미만으로 설정하면 오류가 발생합니다. 크기는 정수이며 KB 또는 MB 값일 수 있습니다. 크기가 KB로 지정되는 경우 최소 허용 크기는 64KB입니다. MAX_EVENT_SIZE 설정되면 MAX_MEMORY 외에도 두 개의 크기의 버퍼가 생성되고 이벤트 버퍼링에 사용되는 총 메모리는 MAX_MEMORY + 2 * MAX_EVENT_SIZE.
MEMORY_PARTITION_MODE = { NONE | PER_NODE | PER_CPU }
이벤트 버퍼가 만들어지는 위치를 지정합니다.
NONESQL Server 인스턴스 내에 한 개의 버퍼 세트가 만들어집니다.
PER_NODE NUMA 노드당 한 개의 버퍼 세트가 만들어집니다.
PER_CPU CPU당 한 개의 버퍼 세트가 만들어집니다.
TRACK_CAUSALITY = { ON | OFF }
인과 관계를 추적할지 여부를 지정합니다. 이를 ON으로 설정하면 인과 관계에 따라 다른 서버 연결에 있는 관련 이벤트의 상호 연결이 허용됩니다.
STARTUP_STATE = { ON | OFF }
SQL Server가 시작될 때 해당 이벤트 세션을 자동으로 시작할지 여부를 지정합니다.
참고
STARTUP_STATE = ON
이면 SQL Server을(를) 중지했다가 다시 시작한 경우에만 이벤트 세션이 시작됩니다.
ON 시작 시 이벤트 세션이 시작됩니다.
OFF 이벤트 세션은 시작 시 시작되지 않습니다.
설명
논리 연산자의 우선 순위는 NOT
(가장 높음), AND
, OR
순입니다.
사용 권한
SQL Server 및 SQL Managed Instance에서는 (SQL Server 2022에서 도입) 또는 ALTER ANY EVENT SESSION
권한이 필요합니다 CREATE ANY EVENT SESSION
.
SQL Database에서 데이터베이스의 ALTER ANY DATABASE EVENT SESSION
권한이 필요합니다.
팁
SQL Server 2022에는 확장 이벤트에 대한 보다 세부적인 여러 가지 권한이 도입되었습니다. 자세한 내용은 블로그: POLP 준수를 개선하기 위한 SQL Server 2022 및 Azure SQL에 대한 새로운 세분화된 권한입니다.
예제
SQL Server 예제
다음 예에서는 test_session
이라는 이벤트 세션을 만드는 방법을 보여 줍니다. 두 개의 이벤트를 추가하며 Windows용 이벤트 추적 대상을 사용합니다.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='test_session')
DROP EVENT session test_session ON SERVER;
GO
CREATE EVENT SESSION test_session
ON SERVER
ADD EVENT sqlos.async_io_requested,
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.etw_classic_sync_target
(SET default_etw_session_logfile_path = N'C:\demo\traces\sqletw.etl' )
WITH (MAX_MEMORY=4MB, MAX_EVENT_SIZE=4MB);
GO
Azure SQL 예제
Azure SQL Managed Instance 또는 Azure SQL Database에서 .xel 파일을 Azure Blob Storage에 저장합니다. 직접 만들고 Azure Blob Storage에 저장하는 확장 이벤트 세션에서 읽으려면 sys.fn_xe_file_target_read_file
을 사용할 수 있습니다. 예를 들어 연습에서는 Azure SQL Database 및 Azure SQL Managed Instance의 확장 이벤트에 대한 이벤트 파일 대상 코드를 검토합니다.
코드 예제는 Azure SQL Database 및 SQL Managed Instance에서 다를 수 있습니다.
SQL Server용으로 작성된 일부 Transact-SQL 코드 예제를 Azure에서 실행하려면 몇 가지 사항을 변경해야 합니다. 이러한 코드 예제의 한 범주에는 데이터베이스 엔진 유형에 따라 이름 접두사 차이가 있는 카탈로그 뷰가 포함됩니다.
server_
- SQL Server 및 Azure SQL Managed Instance의 접두사database_
- Azure SQL Database 및 SQL Managed Instance의 접두사
Azure SQL Database는 데이터베이스 범위 이벤트 세션만 지원합니다. SSMS(SQL Server Management Studio)는 Azure SQL Database의 데이터베이스 범위 이벤트 세션을 완벽하게 지원합니다. 데이터베이스 범위 세션을 포함하는 확장 이벤트 노드는 개체 탐색기의 각 데이터베이스 아래에 표시됩니다.
Azure SQL Managed Instance는 데이터베이스 범위 세션과 더 서버 범위 세션을 모두 지원합니다. SSMS는 SQL Managed Instance의 서버 범위 세션을 완벽하게 지원합니다. 모든 서버 범위 세션을 포함하는 확장 이벤트 노드는 개체 탐색기에서 각 관리되는 인스턴스의 관리 폴더 아래에 표시됩니다.
참고 항목
관리되는 인스턴스에는 서버 범위 세션이 권장됩니다. 데이터베이스 범위 세션은 Azure SQL Managed Instance에 대한 SSMS의 개체 탐색기에 표시되지 않습니다. 데이터베이스 범위 세션은 관리되는 인스턴스를 사용하는 경우에만 Transact-SQL을 통해 쿼리하고 관리할 수 있습니다.
예시를 위해 다음 표에서는 카탈로그 뷰의 두 하위 집합을 나열하고 비교합니다. 알아보기 쉽도록 하위 집합은 _event
문자열을 포함하는 뷰 이름으로 제한되었습니다. 하위 집합은 각기 다른 데이터베이스 엔진 유형을 지원하기 때문에 이름 접두사가 서로 다릅니다.
SQL Server 및 Azure SQL Managed Instance의 이름 | Azure SQL Database 및 Azure SQL Managed Instance의 이름 |
---|---|
server_event_notifications server_event_session_actions server_event_session_events server_event_session_fields server_event_session_targets server_event_sessions server_events server_trigger_events |
database_event_session_actions database_event_session_events database_event_session_fields database_event_session_targets database_event_sessions |
위의 표에 나와 있는 두 목록은 2022년 3월을 기준으로 정확하게 표시되었습니다. 최신 목록을 보려면 다음 Transact-SQL SELECT
문을 실행합니다.
SELECT name
FROM sys.all_objects
WHERE
(name LIKE 'database[_]%' OR
name LIKE 'server[_]%' )
AND name LIKE '%[_]event%'
AND type = 'V'
AND SCHEMA_NAME(schema_id) = 'sys'
ORDER BY name;
참고 항목
- sys.server_event_sessions(Transact-SQL)
- sys.dm_xe_objects(Transact-SQL)
- sys.dm_xe_object_columns(Transact-SQL)