0
点赞
收藏
分享

微信扫一扫

SQL Server死锁跟踪常用方法


一、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的创建脚本,方便批量配置。

SQL Server死锁跟踪常用方法_sqlserver

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

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

SQL Server死锁跟踪常用方法_java_02

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

  • SQL:StmtCompleted
  • SQL:StmtStarting

SQL Server死锁跟踪常用方法_数据库_03

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

SQL Server死锁跟踪常用方法_数据库_04

点击运行即开始收集。

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

SQL Server死锁跟踪常用方法_sqlserver_05

SQL Profiler输出如下

SQL Server死锁跟踪常用方法_java_06

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

SQL Server死锁跟踪常用方法_数据库_07

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

SQL Server死锁跟踪常用方法_SQL_08

下面是其XML格式

SQL Server死锁跟踪常用方法_SQL_09

四、 扩展事件

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

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

SQL Server死锁跟踪常用方法_java_10

输出类似

SQL Server死锁跟踪常用方法_java_11

SQL Server死锁跟踪常用方法_死锁_12

下面是配置方法

SQL Server死锁跟踪常用方法_SQL_13

右键 --> 新建会话向导

SQL Server死锁跟踪常用方法_java_14

SQL Server死锁跟踪常用方法_SQL_15

 

SQL Server死锁跟踪常用方法_java_16

 

SQL Server死锁跟踪常用方法_数据库_17

SQL Server死锁跟踪常用方法_数据库_18

SQL Server死锁跟踪常用方法_数据库_19

SQL Server死锁跟踪常用方法_SQL_20

SQL Server死锁跟踪常用方法_数据库_19

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

五、 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死锁跟踪常用方法_数据库_22


SQL Server死锁跟踪常用方法_数据库_23

参考

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

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

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

举报

相关推荐

0 条评论