SQL Server 확장이벤트(XEvent)
SQL에서 일정한 주기로 Query를 실행하여 Database의 상태를 조회하지 않고 확장이벤트를 사용하여 모니터링 할 수있다고 한다.
아직 이기술에 대해 사용해본적이 없어서 내자신이 깊이 설명하지 못하는 점이 아쉽다.
나중에 사요하기 위해 자료를 수집하여 보관한다.
SQL Server 확장이벤트(XEvent)소개
확장 이벤트를 사용하여 시스템 작업 모니터링
이 절차는 확장 이벤트를 ETW(Windows용 이벤트 추적)와 함께 사용하여 시스템 작업을 모니터링하는 방법을 설명합니다. 또한 CREATE EVENT SESSION, ALTER EVENT SESSION 및 DROP EVENT SESSION 문을 사용하는 방법도 보여 줍니다.
이 태스크를 수행하려면 SQL Server Management Studio 에서 쿼리 편집기를 사용하여 다음 절차를 수행해야 합니다. 또한 명령 프롬프트를 사용하여 ETW 명령도 실행해야 합니다.
확장 이벤트를 사용하여 시스템 작업을 모니터링하려면
쿼리 편집기에서 다음 문을 실행하여 이벤트 세션을 만들고 두 개의 이벤트를 추가합니다. checkpoint_begin 및 checkpoint_end 이벤트는 데이터베이스 검사점이 시작될 때와 끝날 때 실행됩니다.
CREATE EVENT SESSION test0 ON SERVER ADD EVENT sqlserver.checkpoint_begin, ADD EVENT sqlserver.checkpoint_end WITH (MAX_DISPATCH_LATENCY = 1 SECONDS) go
버킷이 32개인 버킷팅 대상을 추가하여 데이터베이스 ID를 기준으로 검사점 수를 계산합니다.
ALTER EVENT SESSION test0 ON SERVER ADD TARGET package0.histogram ( SET slots = 32, filtering_event_name = 'sqlserver.checkpoint_end', source_type = 0, source = 'database_id' ) go
다음 문을 실행하여 ETW 대상을 추가합니다. 그러면 검사점의 소요 시간을 확인하는 데 사용할 수 있는 시작 및 끝 이벤트를 확인할 수 있습니다.
ALTER EVENT SESSION test0 ON SERVER ADD TARGET package0.etw_classic_sync_target go
다음 문을 실행하여 세션 및 이벤트 수집을 시작합니다.
ALTER EVENT SESSION test0 ON SERVER STATE = start go
다음 문을 실행하여 세 이벤트를 실행합니다.
USE tempdb checkpoint go USE master checkpoint checkpoint go
다음 문을 실행하여 이벤트 수를 확인합니다.
SELECT CAST(xest.target_data AS xml) Bucketizer_Target_Data_in_XML FROM sys.dm_xe_session_targets xest JOIN sys.dm_xe_sessions xes ON xes.address = xest.event_session_address JOIN sys.server_event_sessions ses ON xes.name = ses.name WHERE xest.target_name = 'histogram' AND xes.name = 'test0' go
명령 프롬프트에서 다음 명령을 실행하여 ETW 데이터를 확인합니다.
참고
tracerpt 명령에 대한 도움말을 보려면 명령 프롬프트에서tracerpt /?
를 입력하세요.logman query -ets --- List the ETW sessions. This is optional. logman update XE_DEFAULT_ETW_SESSION -fd -ets --- Flush the ETW log. tracerpt %temp%\xeetw.etl -o xeetw.txt --- Dump the events so they can be seen.
다음 문을 실행하여 이벤트 세션을 중지하고 서버에서 제거합니다.
ALTER EVENT SESSION test0 ON SERVER STATE = STOP go DROP EVENT SESSION test0 ON SERVER go
빠른 시작: SQL Server의 확장 이벤트
이 문서는 확장 이벤트를 사용해 본 적이 없고 몇 분 내에 이벤트 세션을 만들려는 SQL 개발자를 대상으로 합니다. 확장 이벤트를 사용하면 SQL 시스템 및 응용 프로그램의 내부 작업에 대한 세부 정보를 볼 수 있습니다. 확장 이벤트 세션을 만들 때는 다음을 지정합니다.
- 관심 있는 항목
- 원하는 데이터를 시스템에 보고할 방법
이 문서에서는 다음을 수행합니다.
- 스크린샷을 사용하여 SSMS.exe에서의 클릭을 통해 이벤트 세션을 만드는 방법을 보여 줍니다.
- 해당 Transact-SQL 문과 스크린샷을 관련시킵니다.
- 이벤트 세션에 대한 클릭 및 T-SQL의 용어 및 개념에 대해 자세히 설명합니다.
- 이벤트 세션을 테스트하는 방법을 보여 줍니다.
- 결과에 대한 대체 방법을 설명합니다.
- 결과의 저장소 캡처
- 처리된 결과와 처리되지 않은 결과 비교
- 다양한 방법 및 다양한 시간 단위의 결과를 보기 위한 도구
- 사용 가능한 모든 이벤트를 검색하는 방법을 보여 줍니다.
- 확장 이벤트를 위한 DMV(동적 관리 뷰)에 포함된 기본 키와 외래 키 관계를 제공합니다.
- 자세한 내용을 볼 수 있는 관련 문서를 소개합니다.
블로그 및 기타 비공식 대화에서는 확장 이벤트를 약어 xevents로 부르기도 합니다.
|
---|
Microsoft SQL Server 및 Azure SQL 데이터베이스의 확장 이벤트 간 차이점에 대해서는 SQL 데이터베이스의 확장 이벤트를 참조하세요. |
예정된 데모를 실제로 수행하기 전에 다음과 같은 사전 지식이 필요합니다.
- SSMS(SQL Server Management Studio) 다운로드
- 매월 SSMS의 최신 월별 업데이트를 설치해야 합니다.
- Microsoft SQL Server 2014 이상 또는 Azure SQL 데이터베이스 데이터베이스에 로그인합니다.
SELECT @@version
은 첫 번째 노드가 12 이상인 값을 반환합니다. - 사용자 계정에 서버 사용 권한 ALTER ANY EVENT SESSION이 있는지 확인합니다.
- 확장 이벤트 관련 보안 및 사용 권한에 대한 자세한 내용은 이 문서 뒷부분에 있는 부록을 확인하세요.
SSMS.exe는 확장 이벤트에 대한 최상의 UI(사용자 인터페이스)를 제공합니다. UI를 사용하면 확장 이벤트에 대해 Transact-SQL 또는 DMV(동적 관리 뷰)를 사용할 필요가 없으므로 많은 사용자에게 유용합니다.
이 섹션에서는 확장 이벤트를 만들고 이 이벤트에서 보고하는 데이터를 보는 UI 단계를 볼 수 있습니다. 단계를 마친 후에는 이해도를 높이기 위해 이 단계와 관련된 개념을 읽을 수 있습니다.
데모 단계
작업을 수행하지 않으려는 경우에도 단계를 이해할 수 있습니다. 새 세션 대화 상자가 시작됩니다. 다음과 같은 4개의 페이지를 처리합니다.
- 일반
- 이벤트
- 데이터 저장소
- 고급
추후 SSMS UI가 변경될 경우 텍스트와 지원되는 스크린샷이 약간 달라질 수 있습니다. 불일치하거나 약간 달라진 경우에도 설명에 대한 스크린샷은 유효합니다.
SSMS와 연결합니다.
개체 탐색기에서 관리 > 확장 이벤트 > 새 세션을 클릭합니다.
- 두 개가 서로 비슷하지만 새 세션 마법사보다 새 세션 대화 상자를 사용하는 것이 좋습니다.
왼쪽 위에서 일반 페이지를 클릭합니다. 그런 다음 세션 이름 입력란에 YourSession 또는 원하는 이름을 입력합니다.
- 확인 단추는 데모 마지막에 눌러야 하므로 아직 누르지 마세요.
왼쪽 위에서 이벤트 페이지를 클릭한 다음 선택 단추를 클릭합니다.
이벤트 라이브러리 영역의 드롭다운 목록에서 이벤트 이름만을 선택합니다.
- 입력란에 sql을 입력하면 contains 연산자를 사용하여 사용 가능한 이벤트의 긴 목록을 필터링하고 줄일 수 있습니다.
- 스크롤하여 sql_statement_completed 이벤트를 클릭합니다.
- 오른쪽 화살표 단추 >를 클릭하여 이벤트를 선택한 이벤트 상자로 이동합니다.
이벤트 페이지에서 맨 오른쪽에 있는 구성 단추를 클릭합니다.
- 다음 스크린샷은 더 쉽게 볼 수 있도록 왼쪽이 잘려 있어 이벤트 구성 옵션 영역을 볼 수 있습니다.
필터(조건자) 탭을 클릭합니다. 그런 다음 절을 추가하려면 여기를 클릭하세요.를 클릭하여 HAVING 절을 포함하는 모든 SQL SELECT 문을 캡처합니다.
필드 드롭다운 목록에서 sqlserver.sql_text를 선택합니다.
연산자에 대해 LIKE 연산자를 선택합니다.
값에 %SELECT%HAVING%을 입력합니다.
참고 이 두 부분의 이름에서 sqlserver는 패키지 이름이고 sql_text는 필드 이름입니다. 이전에 선택한 sql_statement_completed 이벤트는 선택한 필드와 같은 패키지에 있어야 합니다.
왼쪽 위에서 데이터 저장소 페이지를 클릭합니다.
대상 영역에서 대상을 지정하려면 여기를 클릭하세요.를 클릭합니다.
- 형식 드롭다운 목록에서 event_file을 선택합니다.
- 즉, 사용자가 볼 수 있는 파일에 이벤트 데이터가 저장됩니다.
속성 영역의 서버의 파일 이름 입력란에 전체 경로 및 파일 이름을 입력합니다.
- 파일 이름 확장명은 .xel이어야 합니다.
- 작은 테스트의 파일 크기는 1MB 미만이어야 합니다.
왼쪽 위에서 고급 페이지를 클릭합니다.
- 최대 디스패치 대기 시간을 3초 미만으로 줄입니다.
- 마지막으로 아래쪽의 확인 단추를 클릭합니다.
개체 탐색기로 돌아가서 관리 > 세션을 확장하고 YourSession에 대한 새 노드를 확인합니다.
이벤트 세션 편집
SSMS 개체 탐색기에서 해당 노드를 마우스 오른쪽 단추로 클릭하고 속성을 클릭하여 이벤트 세션을 편집할 수 있습니다. 동일한 다중 페이지 대화 상자가 표시됩니다.
이벤트 세션에 대한 해당 T-SQL
SSMS UI를 사용하여 이벤트 세션을 만든 T-SQL 스크립트를 생성했습니다. 다음과 같이 생성된 스크립트를 확인할 수 있습니다.
- 세션 노드를 마우스 오른쪽 단추로 클릭하고 세션 스크립팅 > CREATE > 클립보드를 클릭합니다.
- 텍스트 편집기에 붙여넣습니다.
다음은 UI를 클릭하여 생성된 YourSession에 대한 T-SQL CREATE EVENT SESSION 문입니다.
CREATE EVENT SESSION [YourSession] ON SERVER ADD EVENT sqlserver.sql_statement_completed ( ACTION(sqlserver.sql_text) WHERE ( [sqlserver].[like_i_sql_unicode_string]( [sqlserver].[sql_text], N'%SELECT%HAVING%' ) ) ) ADD TARGET package0.event_file (SET filename = N'C:\Junk\YourSession_Target.xel', max_file_size = (2), max_rollover_files = (2) ) WITH ( MAX_MEMORY = 2048 KB, EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 3 SECONDS, MAX_EVENT_SIZE = 0 KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF ); GO
|
---|
Azure SQL 데이터베이스의 경우 위의 CREATE EVENT SESSION 문에서 ON DATABASE 대신 ON SERVER 절을 사용합니다. Microsoft SQL Server 및 Azure SQL 데이터베이스의 확장 이벤트 간 차이점에 대해서는 SQL 데이터베이스의 확장 이벤트를 참조하세요. |
이벤트 세션의 Pre-DROP
이름이 이미 있는 경우 CREATE EVENT SESSION 문 앞에서 DROP EVENT SESSION을 조건부로 실행할 수 있습니다.
IF EXISTS (SELECT * FROM sys.server_event_sessions -- If Microsoft SQL Server. --FROM sys.database_event_sessions -- If Azure SQL Database in the cloud. WHERE name = 'YourSession') BEGIN DROP EVENT SESSION YourSession ON SERVER; -- If Microsoft SQL Server. --ON DATABASE; -- If Azure SQL Database. END go
이벤트 세션을 시작 및 중지하는 ALTER
만들어진 이벤트 세션은 기본적으로 자동으로 실행되지 않습니다. 언제든지 다음 T-SQL ALTER EVENT SESSION 문을 사용하여 이벤트 세션을 시작하거나 중지할 수 있습니다.
ALTER EVENT SESSION [YourSession] ON SERVER --ON DATABASE STATE = START; -- STOP;
SQL Server 인스턴스가 시작될 때 이벤트 세션이 자동으로 시작되도록 설정할 수 있습니다. CREATE EVENT SESSION의 STARTUP STATE = ON 키워드를 참조하세요.
- SSMS UI는 새 세션 > 일반 페이지에 해당 확인란을 제공합니다.
다음 간단한 단계를 통해 이벤트 세션을 테스트합니다.
- SSMS 개체 탐색기에서 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션 시작을 클릭합니다.
- 다음
SELECT...HAVING
문을 두 번 실행합니다.- 두 번 실행 중
HAVING Count
값을 2와 3으로 전환하여 사용하는 것이 좋습니다. 이렇게 하면 결과의 차이점을 볼 수 있습니다.
- 두 번 실행 중
- 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션 중지를 클릭합니다.
- 다음 하위 섹션에서 결과 선택 및 확인 방법을 읽어 보세요.
SELECT c.name, Count(*) AS [Count-Per-Column-Repeated-Name] FROM sys.syscolumns AS c JOIN sys.sysobjects AS o ON o.id = c.id WHERE o.type = 'V' AND c.name like '%event%' GROUP BY c.name HAVING Count(*) >= 3 --2 -- Try both values during session. ORDER BY c.name;
이해를 돕기 위해 앞에서 설명한 SELECT...HAVING의 대략적인 결과를 제공합니다.
/*** Approximate output, 6 rows, all HAVING Count >= 3: name Count-Per-Column-Repeated-Name --------------------- ------------------------------ event_group_type 4 event_group_type_desc 4 event_session_address 5 event_session_id 5 is_trigger_event 4 trace_event_id 3 ***/
전체 결과를 XML로 선택
SSMS에서 다음 T-SQL SELECT를 실행하여 각 행에서 한 이벤트 항목에 관한 데이터를 제공하는 결과를 반환합니다. CAST AS XML을 사용하면 결과를 쉽게 확인할 수 있습니다.
|
---|
이벤트 시스템은 항상 지정한 .xel event_file 파일 이름에 long 형식의 숫자를 추가합니다. 파일에서 다음 SELECT를 실행하기 전에 먼저 시스템에 의해 지정된 전체 이름을 복사하고 SELECT에 붙여넣습니다. |
SELECT object_name, file_name, file_offset, event_data, 'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS], CAST(event_data AS XML) AS [event_data_XML] -- TODO: In ssms.exe results grid, double-click this xml cell! FROM sys.fn_xe_file_target_read_file( 'C:\Junk\YourSession_Target_0_131085363367310000.xel', null, null, null );
위의 SELECT는 지정된 이벤트 행의 전체 결과를 확인하는 두 가지 방법을 제공합니다.
- SSMS에서 SELECT를 실행하고 event_data_XML 열에서 셀을 클릭합니다. 이 기능은 매우 유용합니다.
- event_data 열의 셀에서 긴 XML 문자열을 복사합니다. Notepad.exe와 같은 간단한 텍스트 편집기에 붙여넣고 XML 확장명을 가진 파일에 문자열을 저장합니다. 그런 다음 브라우저에서 .XML 파일을 엽니다.
하나의 이벤트에 대한 결과 표시
다음은 XML 형식으로 결과의 일부를 확인합니다. 여기서는 더 간단히 표시하기 위해 XML을 편집했습니다. <data name="row_count">
의 값은 6
이며 이는 앞에서 표시된 6개의 결과 행에 해당합니다. 또한 전체 SELECT 문도 볼 수 있습니다.
<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z"> <data name="duration"> <value>111021</value> </data> <data name="cpu_time"> <value>109000</value> </data> <data name="physical_reads"> <value>0</value> </data> <data name="last_row_count"> <value>6</value> </data> <data name="offset"> <value>0</value> </data> <data name="offset_end"> <value>584</value> </data> <data name="statement"> <value>SELECT c.name, Count(*) AS [Count-Per-Column-Repeated-Name] FROM sys.syscolumns AS c JOIN sys.sysobjects AS o ON o.id = c.id WHERE o.type = 'V' AND c.name like '%event%' GROUP BY c.name HAVING Count(*) >= 3 --2 -- Try both values during session. ORDER BY c.name</value> </data> </event>
SSMS UI에는 확장 이벤트에서 캡처된 데이터를 보는 데 사용할 수 있는 여러 가지 고급 기능이 있습니다. 자세한 내용은 다음을 참조하세요.
기본적으로 상황에 맞는 메뉴 옵션인 대상 데이터 보기 및 라이브 데이터 감시에서 시작합니다.
대상 데이터 보기
SSMS 개체 탐색기에서 이벤트 세션 노드 아래의 대상 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 대상 데이터 보기를 클릭합니다. 데이터가 표시됩니다.
이벤트에서 새 데이터가 보고될 때 디스플레이가 업데이트되지 않습니다. 그러나 대상 데이터 보기를 다시 클릭할 수 있습니다.
라이브 데이터 감시
SSMS 개체 탐색기에서 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 라이브 데이터 감시를 클릭합니다. 실시간으로 계속 들어오는 데이터를 표시합니다.
확장 이벤트의 효과적인 사용에 대한 많은 시나리오를 제공합니다. 다음 문서는 쿼리 중 발생한 잠금과 관련된 예제 시나리오를 제공합니다.
다음 문서에서는 잠금 평가에 대한 이벤트 세션 시나리오에 대해 설명합니다. 또한 이 문서에서는 @dbid 사용 및 동적 EXECUTE (@YourSqlString)
사용에 대한 고급 기술도 보여 줍니다.
- 가장 많은 잠금이 발생한 개체 찾기
- 이 시나리오에서는 사용자에게 표시하기 전에 원시 이벤트 데이터를 처리하는 대상 package0.histogram을 사용합니다.
- 잠금을 보유한 쿼리 파악
- 이 시나리오에서는 이벤트 쌍이 sqlserver.lock_acquire 및 lock_release인 target package0.pair_matching을 사용합니다.
다음 표에서는 확장 이벤트에 사용된 용어를 나열하고 그 의미를 설명합니다.
용어 | 설명 |
---|---|
이벤트 세션 | 하나 이상의 이벤트와 동작 및 대상 등 지원되는 항목에 대한 구성입니다. CREATE EVENT SESSION 문은 각 이벤트 세션을 생성합니다. 이벤트 세션이 원하는 대로 시작 및 중지되도록 변경할 수 있습니다. 이벤트 세션을 세션이라고 하는 경우도 있으며 컨텍스트상 구분이 필요한 경우에는 이벤트 세션이라고 합니다. 이벤트 세션에 대한 자세한 내용은 SQL Server 확장 이벤트 세션을 참조하세요. |
이벤트 | 활성 이벤트 세션에서 감시하는 시스템의 특정 항목입니다. 예를 들어 sql_statement_completed 이벤트는 지정한 T-SQL 문이 완료되는 시점을 나타냅니다. 이벤트는 지속 시간 및 기타 데이터를 보고할 수 있습니다. |
target | 캡처한 이벤트에서 출력 데이터를 수신하는 항목입니다. 대상은 데이터를 표시합니다. 예제에는 event_file 및 간편한 메모리 ring_buffer가 있습니다. 조금 더 복잡한 histogram 대상은 표시하기 전에 데이터를 일부 처리합니다. 모든 대상을 모든 이벤트 세션에 대해 사용할 수 있습니다. 자세한 내용은 SQL Server에서 확장 이벤트에 대한 대상을 참조하세요. |
action | 이벤트에 알려진 필드입니다. 필드의 데이터가 대상으로 전송됩니다. 작업 필드는 조건자 필터와 밀접한 관련이 있습니다. |
조건자 필터 | 이벤트 필드의 데이터 테스트는 이벤트 항목 중 관심 있는 하위 집합만 대상으로 전송되도록 하는 데 사용됩니다. 예를 들어 T-SQL 문에 HAVING 문자열이 포함된 sql_statement_completed 이벤트 항목만 필터에 포함할 수 있습니다. |
패키지 | 이벤트의 핵심과 관련된 항목 집합의 각 항목에 연결된 이름 한정자입니다. 예를 들어 패키지에는 T-SQL 텍스트에 대한 이벤트가 있을 수 있습니다. 하나의 이벤트가 GO로 구분된 일괄 처리의 모든 T-SQL과 관련될 수 있습니다. 한편 개별 T-SQL 문에 대한 이벤트도 있습니다. 또한 모든 T-SQL 문에 대해 시작 및 완료 이벤트가 있습니다. 이벤트에 적합한 필드는 이벤트가 있는 패키지에도 있습니다. 대부분의 대상은 package0에 있으며 다른 여러 패키지의 이벤트와 함께 사용됩니다. |
다음 T-SQL SELECT는 이름에 'sql'이라는 세 자가 포함된 각 사용 가능 이벤트에 대해 행을 반환합니다. 물론 LIKE 값을 편집하여 다른 이벤트 이름을 검색할 수 있습니다. 이 행은 이벤트가 포함된 패키지의 이름을 지정합니다.
SELECT -- Find an event you want. p.name AS [Package-Name], o.object_type, o.name AS [Object-Name], o.description AS [Object-Descr], p.guid AS [Package-Guid] FROM sys.dm_xe_packages AS p JOIN sys.dm_xe_objects AS o ON p.guid = o.package_guid WHERE o.object_type = 'event' --'action' --'target' AND p.name LIKE '%' AND o.name LIKE '%sql%' ORDER BY p.name, o.object_type, o.name;
다음 화면에서는 반환된 행을 보여 주며 여기에서 열 이름 = 값 형식으로 편집합니다. 데이터는 앞의 예제 단계에 사용된 sql statement_completed 이벤트에서 가져옵니다. Object-Descr 열에 대한 문장이 특히 유용합니다.
Package-Name = sqlserver object_type = event Object-Name = sql_statement_completed Object-Descr = Occurs when a Transact-SQL statement has completed. Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491
검색을 위한 SSMS UI
다른 검색 옵션은 이전 스크린샷에서 보여 준 SSMS UI 새 세션 > 이벤트 > 이벤트 라이브러리 대화 상자를 사용하는 것입니다.
SQL 추적 이벤트 클래스 및 확장 이벤트
SQL 추적 이벤트 클래스 및 열에서 확장 이벤트 사용에 대한 설명은 SQL 추적 이벤트 클래스에 해당하는 확장 이벤트 항목 확인을 참조하세요.
ETW(Windows용 이벤트 추적) 및 확장 이벤트
ETW(Windows용 이벤트 추적)에서 확장 이벤트 사용에 대한 설명은 다음 문서를 참조하세요.
Azure SQL 데이터베이스의 확장 이벤트에서는 ETW 이벤트를 사용할 수 없습니다.
이 섹션에서는 몇 가지 기타 항목에 대해 간단하게 설명합니다.
SQL Server와 함께 설치되는 이벤트 세션
SQL Server는 몇 가지 확장 이벤트를 기본으로 제공합니다. 이 확장 이벤트는 모두 SQL 시스템이 시작될 때마다 시작하도록 구성되어 있습니다. 이러한 이벤트 세션은 시스템 오류 발생 시 도움이 되는 데이터를 수집합니다. 이러한 이벤트 세션은 모든 확장 이벤트와 마찬가지로 아주 적은 양의 리소스만 사용하므로 계속 실행하는 것이 좋습니다.
이러한 이벤트 세션은 SSMS 개체 탐색기의 관리 > 확장 이벤트 > 세션에서 볼 수 있습니다. 2016년 6월을 기준으로 설치되는 이벤트 세션 목록은 다음과 같습니다.
- AlwaysOn_health
- system_health
- telemetry_events
확장 이벤트에 대한 PowerShell 공급자
SQL Server PowerShell 공급자를 사용하여 SQL Server 확장 이벤트를 관리할 수 있습니다. 자세한 내용은 확장 이벤트에 PowerShell 공급자 사용을 참조하세요.
확장 이벤트에 대한 시스템 뷰
확장 이벤트에 대한 시스템 뷰는 다음과 같습니다.
카탈로그 뷰: CREATE EVENT SESSION에서 정의된 이벤트 세션에 대한 정보가 표시됩니다.
DMV(동적 관리 뷰): 현재 실행 중인 이벤트 세션에 대한 정보가 표시됩니다.
SQL Server 확장 이벤트에 대한 시스템 뷰의 SELECT 및 JOIN은 다음에 대한 정보를 제공합니다.
- 뷰를 서로 조인하는 방법
- 뷰의 몇 가지 유용한 SELECT
- 다음 항목 간의 상관 관계:
- 뷰 열
- CREATE EVENT SESSION 절
- SSMS UI 컨트롤
이 문서에 언급된 사용 권한은 다음과 같습니다.
- ALTER ANY EVENT SESSION
- VIEW SERVER STATE
- CONTROL SERVER
다음 Transact-SQL SELECT 문은 이러한 권한을 가진 사용자를 보고할 수 있습니다.
UNION 직접 권한 및 역할에서 파생된 사용 권한
다음 SELECT... UNION ALL 문은 이벤트 세션을 만들고 확장 이벤트에 대한 시스템 카탈로그 뷰를 쿼리하는 데 필요한 사용 권한을 가진 행을 반환합니다.
-- Ascertain who has the permissions listed in the ON clause. -- 'CONTROL SERVER' permission includes the permissions -- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'. SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission], NULL AS [Role-Name], prin.name AS [Owner-Name], perm.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name] FROM sys.server_permissions AS perm JOIN sys.server_principals AS prin ON prin.principal_id = perm.grantee_principal_id WHERE perm.permission_name IN ('ALTER ANY EVENT SESSION', 'VIEW SERVER STATE', 'CONTROL SERVER') UNION ALL -- Plus check for members of the 'sysadmin' fixed server role, -- because 'sysadmin' includes the 'CONTROL SERVER' permission. SELECT 'Owner-is-Role', prin.name, -- [Role-Name] CAST( (IsNull(pri2.name, N'No members')) AS nvarchar(128)), NULL FROM sys.server_role_members AS rolm RIGHT OUTER JOIN sys.server_principals AS prin ON prin.principal_id = rolm.role_principal_id LEFT OUTER JOIN sys.server_principals AS pri2 ON rolm.member_principal_id = pri2.principal_id WHERE prin.name = 'sysadmin' ORDER BY 1,2,3,4;
HAS_PERMS_BY_NAME 함수
다음 SELECT는 사용 권한을 보고합니다. 기본 제공 함수 HAS_PERMS_BY_NAME을 사용합니다.
또한 일시적으로 다른 계정에 대한 가장 권한이 있는 경우 EXECUTE AS LOGIN 및 REVERT 문의 주석을 제거하여 다른 계정을 조회할 수 있습니다.
--EXECUTE AS LOGIN = 'AccountNameHere'; SELECT HAS_PERMS_BY_NAME( null, null, 'ALTER ANY EVENT SESSION' ); --REVERT;
보안 링크
다음은 이러한 SELECT 및 사용 권한과 관련된 문서에 대한 링크입니다.
'Database > MS-SQL' 카테고리의 다른 글
VC++ SQL 접속(윈도우 서비스 프로그램) (0) | 2017.10.20 |
---|---|
[MS-SQL] SQL Server Express Network 외부원격 연결 설정 방법 (0) | 2017.09.02 |
Where 절에 조건문 결과를 변수로 사용하여 칼럼을 추가,삭제 하는예제 (0) | 2017.08.30 |
[MS-SQL] 테이블명, 컬럼명 검색 (0) | 2017.08.30 |