Hi All,
I want to capture deadlock information and associated batch and tsql stmts . I tried setting up extended event session.
I was able to reproduce the deadlock error but not sure why xml deadlock graph was not getting captured in the .xel file.
Am I doing anything wrong here? Is track_causality option = ON is doing something wrong? Please suggest.
CREATE EVENT SESSION [xe_deadlocks] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.query_plan_hash,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id)
WHERE ([sqlserver].[database_name]=N'testdb' AND [sqlserver].[is_system]=(0))),
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.query_plan_hash,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id)
WHERE ([sqlserver].[database_name]=N'testdb' AND [sqlserver].[is_system]=(0))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.query_plan_hash,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id)
WHERE ([sqlserver].[database_name]=N'testdb' AND [sqlserver].[is_system]=(0))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.query_plan_hash,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id)
WHERE ([sqlserver].[database_name]=N'testdb' AND [sqlserver].[is_system]=(0))),
ADD EVENT sqlserver.xml_deadlock_report(
WHERE ([sqlserver].[database_name]=N'testdb' AND [sqlserver].[is_system]=(0)))
ADD TARGET package0.event_file(SET filename=N'z:\xevents\xe_deadlocks.xel',max_file_size=(1024),max_rollover_files=(4))
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=ON
,STARTUP_STATE=OFF
)
GO
I was trying to pull deadlock information using below sql stmts.But I dont see deadlock information is getting logged.
drop table #results
CREATE TABLE #results
(RowID INT IDENTITY PRIMARY KEY,
event_data XML);
go
DECLARE @Filename VARCHAR(255) = N'z:\xevents\xe_deadlocks*.xel';
-- note: get the path from above serverproperty('errorlogfilename') . This is where system_health session log files are resided
INSERT INTO #results (event_data)
-- Cast the target_data to XML
SELECT CAST(event_data AS XML) AS event_data
FROM sys.fn_xe_file_target_read_file(@Filename, null, null, null)
go
select * from #results
/* Output Deadlock Graphs */
SELECT
event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS eventtimestamp,
event_data.query('(event/data/value/deadlock)[1]') AS DeadlockGraph
FROM #results
WHERE event_data.exist('event[@name="xml_deadlock_report"]') = 1
ORDER BY eventtimestamp ASC
OPTION(MAXDOP 1);
Thanks,
Sam