20172017. 11. 8. 10:13

DBCC DUMPTRIGGER 대신 데이터베이스 엔진 오류가 발생할 때, Extended Events 를 사용해서 덤프를 수집하는 방법을 정리하고자 합니다.

 

테스트 시나리오는 아래와 같이 없는 테이블 개체 'laigo'를 조회했을 때, 208 오류를 반환하게 되는데 이 오류가 발생했을 때, 전체 스레드에 대한 덤프를 생성하는 예제입니다.

 

select * from laigo
/*
Msg 208, Level 16, State 1, Line 1
Invalid object name 'laigo'.
*/

 

 

아래와 같은 형태로 Extended events 를 생성해 줍니다. 중요한 부분은 붉은색으로 표기했습니다.

 

CREATE EVENT SESSION [Capture_dump] ON SERVER

ADD EVENT sqlserver.error_reported(
    ACTION(package0.callstack,
   sqlserver.create_dump_all_threads, -- 모든 스레드에 대한 Stack dump 생성 
   sqlserver.tsql_stack
   )
    WHERE ([package0].[equal_int64]([error_number],(208)) -- 208 오류 발생 시 
   AND [package0].[counter]<=(3))) -- 너무 많은 덤프가 생성되지 않도록 최대 3개로 제한

 

WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

 

실제 SELECT 쿼리로 존재하지 않는 개체를 조회하여 208 오류가 발생했을 때, SQL Server ERRORLOG 폴더에 미니 덤프 파일이 생성되며 최대 3개까지만 생성됩니다. 그리고 ERRORLOG 를 통해 아래와 같이 덤프가 발생한 결과가 출력될 것입니다.

 

**Dump thread - spid = 0, EC = 0x0000022EC4F632B0
*
* User initiated stack dump.  This is not a server exception dump.
*
***Stack Dump being sent to C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\LOG\SQLDump0004.txt
* *******************************************************************************
*
* BEGIN STACK DUMP:
*   11/08/17 09:32:01 spid 55
*
* Dump triggered by event 'error_reported'.
*
* Input Buffer 52 bytes

 

*             select * from laigo

* *******************************************************************************
* -------------------------------------------------------------------------------
* Short Stack Dump
Stack Signature for the dump is 0x00000001E429E8C8
External dump process return code 0x20000001.

 

 

만약 기본 미니 덤프가 아닌 filtered dump 를 생성하고 싶다면? Trace flag 2551 을 미리 설정해 놓으면 됩니다.

 

dbcc traceon(2551, -1) -- filtered dump

 

 

작성자: Lai Go / 작성일자: 2017.11.08

 

Posted by Lai Go