확장이벤트를 사용하여 데드락 정보 확인

 

  • Version : SQL 2008, 2008R2, 2012

 

SQL Server extenede event(확장이벤트)를 사용하여 데드락 정보를 확인해보자.

 

다음 스크립트를 사용하여 교착 상태를 유발 한다. 그리고 데이터를 조회해 보면 이 중 하나는 교착 상태 모니터에 의해 제거 된다.

세션1

세션2

CREATE TABLE t1 (c1 INT);

INSERT INTO t1 VALUES (1);

GO

 

BEGIN TRAN

UPDATE t1 SET c1 = 2;

GO

 
 

CREATE TABLE t2 (c1 INT);

INSERT INTO t2 VALUES (1);

GO

 

BEGIN TRAN

UPDATE t2 SET c1 = 2;

GO

SELECT * FROM t2;

GO

 

 

SELECT * FROM t1;

GO

 

 

 

다음 스크립트를 사용하여 교착 상태의 정보를 확인 할 수 있다. (2008R2에서 테스트)

SELECT CAST (

REPLACE (

REPLACE (

XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'),

'<victim-list>', '<deadlock><victim-list>'),

'<process-list>', '</victim-list><process-list>')

AS XML) AS DeadlockGraph

FROM (SELECT CAST (target_data AS XML) AS TargetData

FROM sys.dm_xe_session_targets st

JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address

WHERE [name] = 'system_health') AS Data

CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)

WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';

 

 

XML 결과값을 클릭하면 다음과 같이 상세 정보를 확인 할 수 있다.

<deadlock-list>

<deadlock>

<victim-list>

<victimProcess id="process53b3048" />

</victim-list>

<process-list>

<process id="process53b3048" taskpriority="0" logused="256" waitresource="RID: 1:1:196:0" waittime="9915" ownerId="7397" transactionname="user_transaction" lasttranstarted="2014-02-26T10:10:22.270" XDES="0x8212f950" lockMode="S" schedulerid="3" kpid="4152" status="suspended" spid="52" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2014-02-26T10:10:41.283" lastbatchcompleted="2014-02-26T10:10:22.270" clientapp="Microsoft SQL Server Management Studio - 쿼리" hostname="WIN-PA3GMI7VEAB" hostpid="3152" loginname="WIN-PA3GMI7VEAB\Administrator" isolationlevel="read committed (2)" xactid="7397" currentdb="1" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">

<executionStack>

<frame procname="" line="2" stmtstart="4" sqlhandle="0x0200000002e8711e46c5b16c64c59932cd9f731c2f071b92" />

</executionStack>

<inputbuf>

 

SELECT * FROM t2;

</inputbuf>

</process>

<process id="process5399288" taskpriority="0" logused="256" waitresource="RID: 1:1:192:0" waittime="3378" ownerId="7429" transactionname="user_transaction" lasttranstarted="2014-02-26T10:10:33.757" XDES="0x82361950" lockMode="S" schedulerid="2" kpid="4144" status="suspended" spid="53" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2014-02-26T10:10:47.813" lastbatchcompleted="2014-02-26T10:10:33.757" clientapp="Microsoft SQL Server Management Studio - 쿼리" hostname="WIN-PA3GMI7VEAB" hostpid="3152" loginname="WIN-PA3GMI7VEAB\Administrator" isolationlevel="read committed (2)" xactid="7429" currentdb="1" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">

<executionStack>

<frame procname="" line="1" sqlhandle="0x02000000c70b7b1daba27f2ddf3e772600949464d524b6f2" />

</executionStack>

<inputbuf>

SELECT * FROM t1;

</inputbuf>

</process>

</process-list>

<resource-list>

<ridlock fileid="1" pageid="196" dbid="1" objectname="" id="lock80110500" mode="X" associatedObjectId="72057594039173120">

<owner-list>

<owner id="process5399288" mode="X" />

</owner-list>

<waiter-list>

<waiter id="process53b3048" mode="S" requestType="wait" />

</waiter-list>

</ridlock>

<ridlock fileid="1" pageid="192" dbid="1" objectname="" id="lock8010f900" mode="X" associatedObjectId="72057594039107584">

<owner-list>

<owner id="process53b3048" mode="X" />

</owner-list>

<waiter-list>

<waiter id="process5399288" mode="S" requestType="wait" />

</waiter-list>

</ridlock>

</resource-list>

</deadlock>

</deadlock-list>

 

 

 

[참고자료]

http://www.sqlskills.com/blogs/paul/getting-historical-deadlock-info-using-extended-events/

 

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 20058
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12120
» 확장이벤트를 사용하여 데드락 정보 확인 jevida(강성욱) 2016.10.15 1644
1933 확장 이벤트를 사용한 CPU 고부하 쿼리 추적 [1] jevida(강성욱) 2016.10.15 2206
1932 데이터에 대한 이해와 spill in tempdb jevida(강성욱) 2016.10.13 1805
1931 로그 파일이 많으면 왜 안 좋은가 jevida(강성욱) 2016.10.13 2109
1930 트랜잭션 백업 실패와 전체 백업 성공 그리고 대처 방안 jevida(강성욱) 2016.10.13 1606
1929 Fast recovery 와 로그 잠금 jevida(강성욱) 2016.10.13 2056
1928 고스트 클린업 jevida(강성욱) 2016.10.13 2325
1927 페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까? jevida(강성욱) 2016.10.13 1701
1926 DBCC WRITEPAGE - DBCC 명령을 사용한 데이터 파괴하기 jevida(강성욱) 2016.10.13 1675
1925 SQL Server Backup Error 3023 jevida(강성욱) 2016.10.13 2423
1924 Delete 작업과 페이지 offset 변화 jevida(강성욱) 2016.10.13 1525
1923 트랜잭션 로그 및 LSN을 이용한 삭제된 데이터 복구 jevida(강성욱) 2016.10.13 5772
1922 PFX 형식의 인증서를 SQL Server에서 사용하기 jevida(강성욱) 2016.10.13 1196
1921 SQL Server NUMA 메모리 노드와 Operating System 접근 jevida(강성욱) 2016.10.13 1358
1920 SQL Server 에러 핸들링 비용 비교 jevida(강성욱) 2016.10.13 1352
1919 압축 백업 시 Checksum 옵션으로 손상 확인하기 jevida(강성욱) 2016.10.13 1737
1918 SQL Server 2012 Memory Manager 구성 jevida(강성욱) 2016.10.13 1292
1917 SQL Server Memory Manager 변화 jevida(강성욱) 2016.10.13 1554
1916 Ring_Buffer_Resource_Monitor jevida(강성욱) 2016.10.13 1069
1915 SQL Server 프로파일러 템플릿 만들기 jevida(강성욱) 2016.10.13 1404





XE Login