SQL Server 跟死锁相关的Trace Flag是 1204 和 1222,两个Trace Flag的Scope都是global only,两者记录的信息基本相同,都会把造成死锁的两个事务、抢占的资源、死锁类型和命令记录下来。前者是以文本格式记录,后者是以XML格式记录的,可以同时打开这两个追踪标志,记录的数据都存储在错误日志(Error Log)中。
微软的官方文档对这两个Trace Falg的定义是:
- 1204:Returns the resources and types of locks participating in a deadlock and also the current command affected.
- 1222:Returns the resources and types of locks that are participating in a deadlock and also the current command affected, in an XML format that does not comply with any XSD schema.
一,打开追踪标志
使用DBCC TRACESTATUS 来查看这两个Trace Flag的状态,Status为0,表示当前这两个Trace Flag都处于OFF状态:
DBCC TRACESTATUS(1204,1222, -1)
使用DBCC TRACEON 启用这两个Trace Flag:
DBCC TRACEON(1204,1222, -1)
再次查看这两个Trace Flag的状态,发现Status为1,表示这两个Trace Flag处于ON状态:
此时,捕获死锁的Trace已经配置完成,一旦系统检测到死锁,就会把死锁发生时的消息都记录到错误日志中。
二,分析追踪数据
在对错误日志进行分析时,通常会需要对数据页进行分析:
DBCC TRACEON (3604) DBCC PAGE('XXXX',file_id,page_id,3) WITH TABLERESULTS DBCC TRACEOFF (3604)
查看Trace 文件:
select top 10 * from fn_trace_gettable('x:xxTrace_xxxx_.trc',default) where TextData like '%xxxx%'
参考文档: