一、Windows计数器

查询自上次重启以来在本服务器上发生的所有死锁:

SELECT cntr_value AS NumOfDeadLocks
  FROM sys.dm_os_performance_counters
 WHERE object_name = 'SQLServer:Locks'
   AND counter_name = 'Number of Deadlocks/sec'
   AND instance_name = '_Total';

二、 1204或1222事件trace

-- 开启
DBCC TRACEON (1204 ,-1) 或 DBCC TRACEON (1222 ,-1) 
--默认是输出到错误日志,如果希望输出到控制台,需要开启3605 trace 
DBCC TRACEON (3605,1204 ,-1) 或 DBCC TRACEON (3605,1222 ,-1)

-- 关闭
DBCC TRACEOFF (1204 ,-1) 或 DBCC TRACEOFF (1222 ,-1) 
DBCC TRACEOFF(3605,1204 ,-1) 或 DBCC TRACEOFF(3605,1222 ,-1)

三、 sql profiler

SQLServer Profiler其实是trace的图形界面版,配置好Profiler后可以导出trace的创建脚本,方便批量配置。

https://img-my.csdn.net/uploads/201303/20/1363772826_1158.png

在【事件选择】页中,展开Locks事件,并选择以下事件:

  • Deadlock graph
  • Lock:Deadlock
  • Lock:Deadlock Chain

https://img-my.csdn.net/uploads/201303/20/1363772934_1604.png

打开TSQL事件,并选择以下事件:

  • SQL:StmtCompleted
  • SQL:StmtStarting

https://img-my.csdn.net/uploads/201303/20/1363772942_4923.png

点击【列筛选器】,在跟踪属性中,选择数据库名为需要侦测的数据库,这里使用AdventureWorks

https://img-my.csdn.net/uploads/201303/20/1363773008_5915.png

点击运行即开始收集。

当死锁发生时,可以看到如下信息

https://img-my.csdn.net/uploads/201303/20/1363773195_5112.pngSQL Profiler输出如下

https://img-my.csdn.net/uploads/201303/20/1363773291_1723.png

点击【Deadlock graph】时,会显示死锁的图像

https://img-my.csdn.net/uploads/201303/20/1363773348_9315.png

可以保存死锁图像,右键然后选择导出事件数据,并另存为xml文件

https://img-my.csdn.net/uploads/201303/20/1363773377_4602.png

下面是其XML格式

https://img-my.csdn.net/uploads/201303/20/1363773408_9975.png

四、 扩展事件

扩展事件监控消耗较低,但是监控信息较少。如果调用存储过程发生的死锁,日志里只能记录下调用存储过程的语句而不是存储过程中具体导致死锁的语句(profiler可以做到)。

系统默认定义了一个system health扩展事件可以监控死锁,但默认仅选择了xml_report输出且sql有截断,不大方便看,可以自己另外配置一个。

输出类似

http://dbaplus.cn/uploadfile/2016/1123/20161123102811681.jpg

http://dbaplus.cn/uploadfile/2016/1123/20161123102853876.jpg

下面是配置方法

右键 --> 新建会话向导

  

选中新建的扩展事件,右键启用。待死锁发生时,便会有日志生成。

五、 Service Broker Event Notifications

USE msdb;
 
--	队列用来保存数据
--	DROP QUEUE DeadlockQueue 
CREATE QUEUE DeadlockQueue WITH STATUS=ON
GO
 
--	将消息传递到数据库中的正确队列
--	DROP SERVICE DeadlockService
CREATE SERVICE DeadlockService
ON QUEUE DeadlockQueue([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO
 
--	创建可向服务发送有关数据库或服务器事件的信息的对象
--	DROP EVENT NOTIFICATION CaptureDeadlocks ON SERVER
CREATE EVENT NOTIFICATION CaptureDeadlocks
ON SERVER
WITH FAN_IN
FOR DEADLOCK_GRAPH
TO SERVICE 'DeadlockService','current database' ;
GO
 
--[此时发生死锁]
 
--	查询XML格式的死锁信息
SELECT CAST(message_body AS XML) AS message_body FROM DeadlockQueue


参考

使用 SQL SERVER PROFILER 监测死锁_weixin_30565199的博客-CSDN博客

SqlServer 并发事务:死锁跟踪(三)6种跟踪死锁的方法总结_薛定谔的DBA的博客-CSDN博客

SQL Server上的一个奇怪的Deadlock及其分析方法 | Microsoft Learn

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐