您当前的位置: 首页 > 数据库教程 > MySQL教程 > 如何捕获和记录SQL Server中发生的死锁

如何捕获和记录SQL Server中发生的死锁

作者:不详 来源:网络 发布时间: 2014-07-24 14:55 点击:
方法一:利用SQL Server代理(Alert+Job) 具体步骤如下: 1.首先使用下面的命令,将有关的跟踪标志启用。 SQL code DBCC TRACEON (3605,1204,1222,-1) 说明: 3605 将DBCC的结果输出到错误日志。 1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令。 1222 返回

如何捕获和记录SQL Server中发生的死锁

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

  
具体步骤如下:

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

  
SQL code

  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.建表,存放死锁记录

  
SQL code

  USE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改。

  GO

  CREATE TABLE DeadLockLog (

  id int IDENTITY (1, 1) NOT NULL,

  LogDate DATETIME,

  ProcessInfo VARCHAR(10),

  ErrorText VARCHAR(MAX)

  )

  GO

  3.建立JOB

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

  SQL code

  --新建临时表

  IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null

  DROP TABLE #ErrorLog

  CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX))

  --将当前日志记录插入临时表

  INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog

  --将死锁信息插入用户表

  insert DeadLockLog

  select a, b, c

  from #ErrorLog

  where id >= (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')

  DROP TABLE #ErrorLog

  4.新建警报

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

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

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

  对象:SQLServer:Locks

  计数器:Number of Deadlocks/sec

  实例:_Total

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

  值:0

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

  


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

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

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

  
具体实现步骤如下:

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

  
SQL code

  -- 定义参数

  declare @rc int

  declare @TraceID int

  declare @maxfilesize bigint

  set @maxfilesize = 5

  -- 初始化跟踪

  exec @rc = sp_trace_create @TraceID output, 0, N'e:/DbLog/deadlockdetect', @maxfilesize, NULL

  --此处的e:/dblog/deadlockdetect是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名

  if (@rc != 0) goto error

  -- 设置跟踪事件

  declare @on bit

  set @on = 1

  --下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spid列(参见sys.trace_columns)

  exec sp_trace_setevent @TraceID, 148, 12, @on

  exec sp_trace_setevent @TraceID, 148, 11, @on

  exec sp_trace_setevent @TraceID, 148, 4, @on

  exec sp_trace_setevent @TraceID, 148, 14, @on

  exec sp_trace_setevent @TraceID, 148, 26, @on

  exec sp_trace_setevent @TraceID, 148, 64, @on

  exec sp_trace_setevent @TraceID, 148, 1, @on

  -- 启动跟踪

  exec sp_trace_setstatus @TraceID, 1

  -- 记录下跟踪ID,以备后面使用

  select TraceID = @TraceID

  goto finish

  error:

  select ErrorCode=@rc

  finish:

  go

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

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

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

  SQL code

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

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

  SQL code

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

  3.查看跟踪文件内容

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

  1).执行t-sql命令

  SQL code

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

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

  2).在SQL Server Profiler中打开。

  依次 进入Profiler -> 打开跟踪文件 ->选择e:/DbLog/deadlockdetect.trc,就可以看到以图形形式展现的死锁信息了。
分享到:
本文"如何捕获和记录SQL Server中发生的死锁"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4