교착 상태 오류가 교착 상태 SQL을 리턴하지 않습니다.


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

내 웹 사이트 중 하나가 바쁠 때이 오류가 무작위로 발생합니다. 나는 그것이 어떤 테이블 세트에서 일어나는지 알고 있지만 다른 프로그램에 대한 경험에서 일반적으로 교착 상태가 발생하는 곳에서 SQL을 반환합니다. 이것이 가능하도록 설정해야하는 플래그가 있습니까?

이것이 교착 상태 자체를 별도의 문제로 시도하고 디버깅 할 것입니다. 이것은 지금 나의 주요 질문입니다.

SQL Server 2008 Standard Edition을 사용하고 있습니다.


서비스를 다시 시작할 수 있습니까? 서비스를 반송 할 수있는 경우 교착 상태 세부 정보를 SQL Server 로그에 기록하기 위해 시작 플래그에 추가 추적 플래그 1204를 추가 할 수 있습니다. > 1204 : 교착 상태 및 현재 명령에 영향을주는 리소스 및 잠금 유형을 반환합니다. >> 범위 : 글로벌 전용
Tevo D

1
구성 관리자를 사용하십시오. SQL Server 서비스에서 마우스 오른쪽 단추를 클릭하고 속성을 엽니 다. 고급 탭, 시작 매개 변수로 이동하십시오. 마스터 데이터베이스 파일의 위치 등에 대한 항목이 있습니다. ;-T1204추적 플래그를 추가 하여 서비스를 종료하고 다시 시작하십시오.
Tevo D

4
왜 서비스를 다시 시작해야합니까? DBCC TRACEON (1204, -1)
Mark Storey-Smith

에서 msdn.microsoft.com/en-us/library/ms188396.aspx : 행동의 변화 :에서 SQL 서버 2000, 간단한 DBCC TRACEON (1204) 오류 로그에 교착 상태보고를 사용하기에 충분하다. SQL Server 2008에서는 세션 수준 플래그가 교착 상태 모니터 스레드에 표시되지 않으므로 플래그를 전역 적으로 사용하도록 설정해야합니다.
Tevo D

2
@TevoD- 전역 -1DBCC TRACEON나타내는 매개 변수 입니다.
Martin Smith

답변:


25

필요한 데이터는 기본 확장 이벤트 추적에 기록됩니다.

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

서비스를 다시 시작한 경우 (예 : 추적 플래그 적용 또는 버퍼가 그 동안 순환 된 경우) 더 이상 존재하지 않습니다.

영구 비 휘발성 저장소의 교착 상태 그래프를 파일 대상에 저장하는 자체 확장 이벤트 추적을 설정할 수 있습니다. 예제 코드 here . 개인적으로 교착 상태 그래프 XML이 추적 플래그 출력보다 친숙하다는 것을 알았습니다.

편집하다

  1. @MartinC 는 모든 업데이트가없는 SQL Server 인스턴스에서 잘못된 XML을 생성하는 데 문제가있을 수 있다고 의견에서 지적합니다. 이에 대한 해결책 은 여기에 설명 된대로 일부 검색 및 교체 및 목록 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에서 사용 하는 입니다.SELECT
  2. 웨인 셰필드에가 표 형식으로 교착 상태 그래프 XML을 분쇄기에 유용한 스크립트를 올렸습니다 여기를 .

슬프게도 EE는 모든 교착 상태를 캡처하지 않으며 버그 인 것 같습니다. connect.microsoft.com/SQLServer/feedback/details/754115/…
Matt

3

허용 대답은 지속적으로 나를 위해 작동하지 않았다. 링 버퍼는 분명히 특정 상황에서 이벤트를 삭제하는 것으로 알려져 있습니다.

ConnectItem

링 버퍼 문제

system_health 로그 이벤트 파일을 구문 분석 할 수 있습니다 ( 이 답변에서 ).

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

XdlFile 필드는 .xdl 파일로 저장하고 SSMS로 읽을 수 있습니다. Sql Server 2012에서 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.