SQL Deadlock Report - Extended Events
SQL Deadlock Report - Extended Events
Event Creation
create EVENT SESSION EE_Deadlock ON SERVER
ADD EVENT sqlserver.xml_deadlock_report
ADD TARGET package0.ring_buffer
(SET max_memory = 4096)
WITH (MAX_DISPATCH_LATENCY = 30 SECONDS);
create Procedure DeadlockReport
as
Begin
alter event session EE_Deadlock ON SERVER state=Stop;
if not exists (select * from Archival.sys.objects where name like '%Deadlock_Data%')
Begin
Create TABLE Archival..Deadlock_Data (
Rowid INT IDENTITY PRIMARY KEY,
event_data XML)
End
Truncate Table Archival..Deadlock_Data
insert into Archival..Deadlock_Data(event_data)
(
select cast(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') 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 = 'EE_Deadlock') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
where XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'
)
if not exists (select * from Archival.sys.objects where name like '%Deadlock_Master%')
Begin
Create TABLE Archival..Deadlock_Master (
Rowid INT IDENTITY PRIMARY KEY,
event_data XML)
End
insert into Archival..Deadlock_Master(event_data) select EVENT_DATA from archival..deadlock_data(nolock)
if not exists (select * from Archival.sys.objects where name like '%deadlock_report%')
Begin
Create table Archival..deadlock_report
(
spid varchar(10),
processid varchar(25),
victimprocessid varchar(25),
dbid varchar(10),
waitresource varchar(100),
lockmode varchar(100),
Timestamp varchar(100),
clientapp varchar(100),
hostname varchar(100),
loginname varchar(100),
victim_list varchar(max)
)
End
Truncate Table Archival..deadlock_report
insert into Archival..deadlock_report(spid,processid,victimprocessid,dbid,waitresource,lockmode,Timestamp,clientapp,hostname,loginname,victim_list)
SELECT
T.X.value('(./@spid)', 'varchar(10)') as spid,
T.X.value('(./@id)', 'varchar(25)') as processid,
T3.Z.value('(./@id)','varchar(25)') as victimprocessid,
T.X.value('(./@currentdb)', 'varchar(10)') as dbid,
T.X.value('(./@waitresource)', 'varchar(100)') as waitresource,
T.X.value('(./@lockMode)', 'varchar(100)') as lockmode,
T.X.value('(./@lasttranstarted)', 'varchar(100)') as TimeStamp,
T.X.value('(./@clientapp)', 'varchar(100)') as clientapp,
T.X.value('(./@hostname)', 'varchar(100)') as hostname,
T.X.value('(./@loginname)', 'varchar(100)') as loginname,
T2.Y.value('.', 'varchar(max)') as victim_list
FROM
Archival..Deadlock_Data
CROSS APPLY
event_data.nodes('/deadlock/process-list/process') T(X)
OUTER APPLY
T.X.nodes('inputbuf') T2(Y)
CROSS APPLY
T.X.nodes('/deadlock/victim-list/victimProcess') T3(Z)order by TimeStamp desc
alter event session EE_Deadlock ON SERVER state=Start;
End
CREATE Procedure DeadlockReport
as
Begin
if not exists (select * from Archival.sys.objects where name like '%Deadlock_Data%')
Begin
Create TABLE Archival..Deadlock_Data (
Rowid INT IDENTITY PRIMARY KEY,
event_data XML)
End
Truncate Table Archival..Deadlock_Data
insert into Archival..Deadlock_Data(event_data)
(
select cast(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') 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 = 'EE_Deadlock') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
where XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'
)
if not exists (select * from Archival.sys.objects where name like '%Deadlock_Master%')
Begin
Create TABLE Archival..Deadlock_Master (
Rowid INT IDENTITY PRIMARY KEY,
event_data XML)
End
insert into Archival..Deadlock_Master(event_data) select EVENT_DATA from archival..deadlock_data(nolock)
if not exists (select * from Archival.sys.objects where name like '%deadlock_report%')
Begin
Create table Archival..deadlock_report
(
spid varchar(10),
processid varchar(25),
victimprocessid varchar(25),
dbid varchar(10),
waitresource varchar(100),
lockmode varchar(100),
Timestamp varchar(100),
clientapp varchar(100),
hostname varchar(100),
loginname varchar(100),
victim_list varchar(max)
)
End
Truncate Table Archival..deadlock_report
insert into Archival..deadlock_report(spid,processid,victimprocessid,dbid,waitresource,lockmode,Timestamp,clientapp,hostname,loginname,victim_list)
SELECT
T.X.value('(./@spid)', 'varchar(10)') as spid,
T.X.value('(./@id)', 'varchar(25)') as processid,
T3.Z.value('(./@id)','varchar(25)') as victimprocessid,
T.X.value('(./@currentdb)', 'varchar(10)') as dbid,
T.X.value('(./@waitresource)', 'varchar(100)') as waitresource,
T.X.value('(./@lockMode)', 'varchar(100)') as lockmode,
T.X.value('(./@lasttranstarted)', 'varchar(100)') as TimeStamp,
T.X.value('(./@clientapp)', 'varchar(100)') as clientapp,
T.X.value('(./@hostname)', 'varchar(100)') as hostname,
T.X.value('(./@loginname)', 'varchar(100)') as loginname,
T2.Y.value('.', 'varchar(max)') as victim_list
FROM
Archival..Deadlock_Data
CROSS APPLY
event_data.nodes('/deadlock/process-list/process') T(X)
OUTER APPLY
T.X.nodes('inputbuf') T2(Y)
CROSS APPLY
T.X.nodes('/deadlock/victim-list/victimProcess') T3(Z)order by TimeStamp desc
alter event session EE_Deadlock ON SERVER state=Stop;
alter event session EE_Deadlock ON SERVER state=Start;
End
Link: http://www.mssqltips.com/sqlservertip/1036/finding-and-troubleshooting-sql-server-deadlocks/
Comments
Post a Comment