我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息。但这种方式有一个很大的敝端,就是消耗很大。据国外某大神测试,profiler甚至可以占到服 务器总带宽的35%,所以,在一个繁忙的系统中,使用profiler显然不是一个好主意,下面我介绍两种消耗比较少的方法。其中第二种的消耗最小,在最 繁忙的系统中也可使用。第一种最为灵活,可满足多种应用。

方法一:利用SQL Server代理(Alert+Job)

具体步骤如下:

1.首先使用下面的命令,将有关的跟踪标志启用。

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

说明:

3605 将DBCC的结果输出到错误日志。

1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令。

1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL 2005及以上可用)。

-1 以全局方式打开指定的跟踪标记。

以上跟踪标志作用域都是全局,即在SQL Server运行过程中,会一直发挥作用,直到SQL Server重启。

如果要确保SQL Server在重启后自动开启这些标志,可以在SQL Server服务启动选项中,使用 /T 启动选项指定跟踪标志在启动期间设置为开。(位于SQL Server配置管理器->SQL Server服务->SQL Server->属性->高级->启动参数)

在运行上面的语句后,当SQL Server中发生死锁时,已经可以在错误日志中看到了,但还不够直观(和其它信息混在一起)。(SSMS -> SQL Server实例 -> 管理 -> SQL Server日志)

2.建表,存放死锁记录

  1. USE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改。
  2. GO
  3. CREATE TABLE DeadLockLog (
  4. id int IDENTITY (1, 1) NOT NULL,
  5. LogDate DATETIME,
  6. ProcessInfo VARCHAR(10),
  7. ErrorText VARCHAR(MAX)
  8. )
  9. GO

3.建立JOB

新建一个JOB(假设名称为DeadLockJob),在"步骤"中新建一步骤,随便写一个步骤名称,数据库为"Cole"(见2.建表),在"命令"栏中输入以下语句:

  1. --新建临时表
  2. IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null
  3. DROP TABLE #ErrorLog
  4. CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX))
  5. --将当前日志记录插入临时表
  6. INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog
  7. --将死锁信息插入用户表
  8. insert DeadLockLog
  9. select a, b, c
  10. from #ErrorLog
  11. where id >= (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')
  12. DROP TABLE #ErrorLog

4.新建警报

在"新建警报"窗体的"常规"选项卡中,进行以下设置:

名称:可根据实际自行命名,这里我用DeadLockAlert

类型:选择"SQL Server性能条件警报"

对象:SQLServer:Locks

计数器:Number of Deadlocks/sec

实例:_Total

计数器满足以下条件时触发警报:高于

值:0

设置完成后,应该如下图所示:

在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)

到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了。

方法二:利用服务器端跟踪。

具体实现步骤如下:

1.编写如下脚本,并执行

  1. -- 定义参数
  2. declare @rc int
  3. declare @TraceID int
  4. declare @maxfilesize bigint
  5. set @maxfilesize = 5
  6. -- 初始化跟踪
  7. exec @rc = sp_trace_create @TraceID output, 0, N'e:/DbLog/deadlockdetect', @maxfilesize, NULL
  8. --此处的e:/dblog/deadlockdetect是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名
  9. if (@rc != 0) goto error
  10. -- 设置跟踪事件
  11. declare @on bit
  12. set @on = 1
  13. --下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spid列(参见sys.trace_columns)
  14. exec sp_trace_setevent @TraceID, 148, 12, @on
  15. exec sp_trace_setevent @TraceID, 148, 11, @on
  16. exec sp_trace_setevent @TraceID, 148, 4, @on
  17. exec sp_trace_setevent @TraceID, 148, 14, @on
  18. exec sp_trace_setevent @TraceID, 148, 26, @on
  19. exec sp_trace_setevent @TraceID, 148, 64, @on
  20. exec sp_trace_setevent @TraceID, 148, 1, @on
  21. -- 启动跟踪
  22. exec sp_trace_setstatus @TraceID, 1
  23. -- 记录下跟踪ID,以备后面使用
  24. select TraceID = @TraceID
  25. goto finish
  26. error:
  27. select ErrorCode=@rc
  28. finish:
  29. go

运行上述语句后,每当SQL Server中发生死锁事件,都会自动往文件e:/DbLog/deadlockdetect.trc中插入一条记录。

2.暂停和停止服务器端跟踪

如果要暂停上面的服务器端跟踪,可运行下面的语句:

exec sp_trace_setstatus 1, 0 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停

如果要停止上面的服务器端跟踪,可运行下面的语句:

exec sp_trace_setstatus 1, 2 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止

3.查看跟踪文件内容

对于上面生成的跟踪文件(e:/DbLog/deadlockdetect.trc),可通过两种方法查看:

1).执行t-sql命令

  1. select * from fn_trace_gettable('e:/DbLog/deadlockdetect.trc',1)

结果中的TextData列即以XML的形式返回死锁的详细信息。

2).在SQL Server Profiler中打开。

依次 进入Profiler -> 打开跟踪文件 ->选择e:/DbLog/deadlockdetect.trc,就可以看到以图形形式展现的死锁信息了。

怎么捕获和记录SQL Server中发生的死锁的更多相关文章

  1. (4.7)怎么捕获和记录SQL Server中发生的死锁?

    转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? 关键词:死锁记录,死锁捕获 sql ...

  2. 捕获和记录SQL Server中发生的死锁

    经带在论坛上看到有人在问怎么捕获和记录死锁信息,在这里,我将自己的一些心得贡献出来,与大家分享,也请各位指正. 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方 ...

  3. 记录sql server中数据创建时间和最后修改时间,方便查找问题

    getdate()用例: 2008-12-29 16:25:46.635 1.创建时间:将字段设置为datetime类型,并设置默认值为 getdate() 2.修改时间:通过触发器,在 update ...

  4. 深入浅出SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  5. SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  6. 深入浅出SQL Server中的死锁(实战篇)

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  7. 深入浅出 关于SQL Server中的死锁问题

    深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44   分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相 ...

  8. 【转载】深入浅出SQL Server中的死锁

    essay from:http://www.cnblogs.com/CareySon/archive/2012/09/19/2693555.html 简介 死锁的本质是一种僵持状态,是多个主体对于资源 ...

  9. 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。

    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ...

随机推荐

  1. 在DJANGO的类视图中实现登陆要求和权限保护

    以前接触的是基于函数的保护,网上材料比较多. 但基于类视图的很少. 补上! Decorating class-based views 装饰类视图 对于类视图的扩展并不局限于使用mixin.你也可以使用 ...

  2. utf8_to_utf16

    17down voteaccepted Here's some code. Only lightly tested and there's probably a few improvements. C ...

  3. bzoj2131

    首先不难想到对t排序,有f[i]=max(f[j])+v[i] tj<=ti且abs(pi-pj)/2<=ti-tj;要想优化,肯定从优化转移入手先去绝对值,当pi>=pj时,可得2 ...

  4. bzoj1041

    基于圆的对称性,我们只需要考虑第一象限的整点即可满足条件的x,y都是整数数学上这类问题我们通常用一个量表示另一个量y^2=(r-x)(r+x)  (r-x)(r+x)要是完全平方数令d=gcd(r-x ...

  5. Spring MVC中DispatcherServlet工作原理探究

    转:http://blog.csdn.net/zhouyuqwert/article/details/6853730 下面类图将主要的类及方法抽离出来,以便查看方便,根据类的结构来说明整个请求是如何工 ...

  6. Linux Eclipse代码提示功能设置(Java & C/C++)

    最近在Linux下开发,由于长期使用Visual Studio 2010,对代码提示功能情有独钟,现在在Linux下,使用Eclipse做开发,当然免不了怀念Visual Studio强悍的代码提示, ...

  7. (转载)Mysql查找如何判断字段是否包含某个字符串

    (转载)http://www.th7.cn/db/mysql/201306/31159.shtml 有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在 ...

  8. java基础(七)面向对象(二)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  9. Objective-c知识小结

    1.创建一个类产生.h和.m两个文件,.h中对用到的变量.方法作声明,.m文件中实现,导入时只导入.h文件,如果直接把方法写在.m文件中,未在.h文件中进行声明,则是私有方法  2.@interfac ...

  10. leetcode 栈 括号匹配

    https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...