DBCC DUMPTRIGGER 대신 데이터베이스 엔진 오류가 발생할 때, Extended Events 를 사용해서 덤프를 수집하는 방법을 정리하고자 합니다.
테스트 시나리오는 아래와 같이 없는 테이블 개체 'laigo'를 조회했을 때, 208 오류를 반환하게 되는데 이 오류가 발생했을 때, 전체 스레드에 대한 덤프를 생성하는 예제입니다.
/*
Msg 208, Level 16, State 1, Line 1
Invalid object name 'laigo'.
*/
아래와 같은 형태로 Extended events 를 생성해 줍니다. 중요한 부분은 붉은색으로 표기했습니다.
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 를 통해 아래와 같이 덤프가 발생한 결과가 출력될 것입니다.
*
* 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 을 미리 설정해 놓으면 됩니다.
작성자: Lai Go / 작성일자: 2017.11.08