捕获和记录SQLServer2008中发生的死锁

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

CREATE TABLE DeadLockLog (  
	Id INT IDENTITY (1, 1) NOT NULL,   
	LogDate DATETIME,   
	ProcessInfo VARCHAR(10),   
	ErrorText VARCHAR(MAX)  
)  

3.在数据库代理下创建一个作业监控和记录死锁

3.0新建一个作业,命名:DeadLockJob
3.1新建一个"步骤",随便写一个步骤名称,选择数据库,在"命令"栏中输入以下语句:

--新建临时表  
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  

3.2新建一个"警报",在"常规"选项卡中按如下设置:
名称:DeadLockAlert
类型:选择"SQL Server性能条件警报"
对象:SQLServer:Locks
计数器:Number of Deadlocks/sec
实例:_Total
计数器满足以下条件时触发警报:高于, 值:0

保存作业就可以了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值