一、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的创建脚本,方便批量配置。
在【事件选择】页中,展开Locks事件,并选择以下事件:
- Deadlock graph
- Lock:Deadlock
- Lock:Deadlock Chain
打开TSQL事件,并选择以下事件:
- SQL:StmtCompleted
- SQL:StmtStarting
点击【列筛选器】,在跟踪属性中,选择数据库名为需要侦测的数据库,这里使用AdventureWorks。
点击运行即开始收集。
当死锁发生时,可以看到如下信息
SQL Profiler输出如下
点击【Deadlock graph】时,会显示死锁的图像
可以保存死锁图像,右键然后选择导出事件数据,并另存为xml文件
下面是其XML格式
四、 扩展事件
扩展事件监控消耗较低,但是监控信息较少。如果调用存储过程发生的死锁,日志里只能记录下调用存储过程的语句而不是存储过程中具体导致死锁的语句(profiler可以做到)。
系统默认定义了一个system health扩展事件可以监控死锁,但默认仅选择了xml_report输出且sql有截断,不大方便看,可以自己另外配置一个。
输出类似
下面是配置方法
右键 --> 新建会话向导
选中新建的扩展事件,右键启用。待死锁发生时,便会有日志生成。
五、 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博客