博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
死锁跟踪:6种跟踪死锁的方法总结
阅读量:5291 次
发布时间:2019-06-14

本文共 4585 字,大约阅读时间需要 15 分钟。

原文地址:http://blog.csdn.net/kk185800961/article/details/42504857

方法一:Windows 性能计数器监控

命令行输入:perfmon  或者 perfmon /sys

选择实例:SQL Server :Locks \\  Number of DeadLocks/sec \\ _Total 

 (只能知道什么时候发生死锁,看不得具体死锁信息)

实时查看:

 

作业记录到文件:(可跟踪一段时间,耗系统性能很小)

 

方法二:打开profiler跟踪事件 locks: deadlock graph

(生成的死锁图可以拷贝出来XML格式的死锁信息)

 

或者导出上面为脚本在后台执行跟踪

--  后台跟踪  declare @rc int    declare @traceid int          --跟踪分配的编号    declare @options int          --TRACE_FILE_ROLLOVER=2/SHUTDOWN_ON_ERROR=4/TRACE_PRODUCE_BLACKBOX=8    declare @tracefile nvarchar(500)--跟踪文件的存储路径    declare @maxfilesize bigint   --跟踪文件的大小,单位是mb,默认5mb    declare @endtime datetime     --停止跟踪的日期和时间,为NULL则表示一直跟踪    declare @filecount int        --跟踪文件的数量,其值大于1,TRACE_FILE_ROLLOVER=2 时有效    set @options = 2    set @tracefile = N'E:\BlockedTraceName'    set @maxfilesize = 20    set @endtime = NULL  set @filecount = 5        --  exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL     exec @rc = sp_trace_Create @TraceID output,@options,@tracefile,@maxfilesize,@endtime,@filecount    if (@rc != 0) goto error      -- Set the events  declare @on bit  set @on = 1  exec sp_trace_setevent @TraceID, 148, 1, @on  exec sp_trace_setevent @TraceID, 148, 12, @on  exec sp_trace_setevent @TraceID, 148, 14, @on  exec sp_trace_setevent @TraceID, 148, 26, @on    -- Set the Filters  declare @intfilter int  declare @bigintfilter bigint    -- Set the trace status to start  exec sp_trace_setstatus @TraceID, 1    -- display trace id for future references  select TraceID=@TraceID  goto finish    error:   select ErrorCode=@rc    finish:   go    --查看跟踪记录  select ServerName,EventClass,StartTime,TextData,CONVERT(XML,TextData) XMLTextData    from ::fn_trace_gettable('E:\BlockedTraceName.trc',default)

 

    

方法三:打开1222或者1204标志记录死锁,在sqlserver日志查看

DBCC TRACEON(1222,-1)    DBCC TRACEON(1204,-1)

 

如果日志太多就不好找了,这时可以用系统扩展存储过程筛选!

--查看是否死锁,确定死锁的的时间  exec xp_readerrorlog 0,1,'deadlock victim',NULL,'2015-01-01','2015-01-10','ASC'    --按时间查看sqlserver日志,即为死锁信息  exec xp_readerrorlog 0,1,NULL,NULL,'2015-01-07 22:13:10','2015-01-07 22:13:11','ASC'

 

 

方法四:扩展事件

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name = 'deadlock')      DROP EVENT SESSION [deadlock] ON SERVER   GO    --  跟踪的事件:database_xml_deadlock_report,xml_deadlock_report (跟踪一个即可,这里跟踪俩个)  --  选择跟踪列:client_hostname,database_name,nt_username,plan_handle,sql_text  CREATE EVENT SESSION [deadlock]   ON SERVER   ADD EVENT sqlserver.database_xml_deadlock_report(      ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.plan_handle,sqlserver.sql_text)),  ADD EVENT sqlserver.xml_deadlock_report(      ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.plan_handle,sqlserver.sql_text))   ADD TARGET package0.event_file(      SET filename=N'D:\Program Files\Microsoft SQL Server\deadlock', --存储路径及文件名前缀      max_file_size=(10),     --最大文件大小,单位MB      max_rollover_files=(4)) --启用文件滚动存储的最大文件数  GO    ALTER EVENT SESSION [deadlock] ON SERVER STATE=START  GO    --查询跟踪  SELECT object_name as event,convert(xml, event_data) as xml_data  FROM master.sys.fn_xe_file_target_read_file('D:\Program Files\Microsoft SQL Server\deadlock*', NULL, NULL, NULL)

 

 

 

方法五:系统扩展事件会话system_health自动记录

--扩展事件会话的信息  select * from sys.dm_xe_sessions where name = 'system_health'      SELECT       xed.value('@timestamp','datetime')as Creation_Date,        xed.query('.')AS Extend_Event    FROM   (        SELECT CAST([target_data] AS XML)AS Target_Data        FROM sys.dm_xe_session_targets AS xt        INNER JOIN sys.dm_xe_sessions AS xs        ON xs.address= xt.event_session_address        WHERE xs.name=N'system_health'        AND xt.target_name=N'ring_buffer'  ) AS XML_Data    CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]')AS XEventData(xed)    ORDER BY Creation_Date DESC

 

 

 

 

方法六: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

 

 

 

转载于:https://www.cnblogs.com/jearay/p/7821356.html

你可能感兴趣的文章
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
https通讯流程
查看>>
Swagger简单介绍
查看>>
C# 连接SQLServer数据库自动生成model类代码
查看>>
关于数据库分布式架构的一些想法。
查看>>
大白话讲解 BitSet
查看>>
sql语句中where与having的区别
查看>>
Python数据分析入门案例
查看>>
0x7fffffff的意思
查看>>
Java的值传递和引用传递
查看>>
HTML5的服务器EventSource(server-sent event)发送事件
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
Ubuntu sudo 出现 is not in the sudoers file解决方案
查看>>
内存地址对齐
查看>>
看门狗 (监控芯片)
查看>>
#ifndef #define #endif
查看>>
css背景样式
查看>>
JavaScript介绍
查看>>