如何自动检测死锁并发送警告邮件

并发事务处理中发生死锁是我们作为DBA不想看到的,但又无法避免的常见实际问题。 能否数据库自动检测发生死锁,并将此信息发送到管理员邮箱呢?

Look here !


首先,我们要捕捉到死锁状态。在SQL Server 中,捕捉状态最常用的方法是 跟踪(Trace) ,具体要跟踪的项目在sql server 中叫做跟踪标记 (trace Flags) .

跟踪死锁,我们就用到了 1204 这个标记。

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

--1204 就是跟踪死锁的标记了

--1222 在官网上写的实在是让人费解。其实就是死锁更详细的信息,比如锁定资源,类型等。
       注意,在SQL 2K5 以上才使用1222,在SQL 2K 中,详细信息要使用1205标记。

--3605 这个标记很多地方使用到,但最新的msdn所提供的信息里,却少之又少。
       追溯到更久远的历史,SQL Server 6.5(对没错,就是6.5)中,就已经开始使用了。如何捕获从 SQL Server 的实例发送到客户端的错误消息

-- -1  最后要说的是这个-1。如果使用中要做到全局作用域内启用跟踪标志,就需要添加这个-1参数。如果仅跟踪当前会话的话,就不使用-1。


这一步做完了,数据库本身就已经开始跟踪死锁了。接下来,需要确认数据库可以发送邮件。走起:如何配制数据库发送邮件


做完上面的步骤,就剩下最后一步了。如何在获取死锁信息的时候,发送邮件。(差点儿忘记说了,建立跟踪的信息,都存在了log中)

--读取Log信息(SQL 2K5及以上)
--创建临时表,用于已数据列形式存储log信息
 IF OBJECT_ID('tempdb.dbo.Log_Error') IS Not Null
 BEGIN
 DROP TABLE tempdb.dbo.Log_Error
 END


CREATE TABLE tempdb.dbo.Log_Error
    (
      id INT IDENTITY(1, 1)
             NOT NULL ,
      记录时间 DATETIME ,
      进程信息 VARCHAR(10) ,
      ERROR_LOG VARCHAR(MAX)
    )


 INSERT INTO tempdb.dbo.Log_Error
 EXEC master.dbo.sp_readerrorlog     --这里还有另外一个systemproc叫做:xp_readerrorlog 也可以用来查看log信息,有兴趣的同学可以google一下


 BEGIN	
	DECLARE @servername nvarchar(150)
	SET @servername = @@servername


	declare @subject nvarchar(200)
	set @subject = '由服务器 '+@servername+' 发出的死锁提醒.'


 EXEC msdb.dbo.sp_send_dbmail @recipients='OrchidCat@gmail.com',    --之前提到的发送数据库邮件
 @subject = @subject,
 @body = '死锁已发生,请查看附件信息',
 @query = 'select 记录时间, 进程信息, ERRORLOG 
			from tempdb.dbo.Log_Error 
			where Id >= (select TOP 1 Id 
						from tempdb.dbo.Log_Error 
						WHERE ERROR_LOG Like ''%Deadlock encountered%'' 
						order by Id DESC)',
 @query_result_width = 600,
 @attach_query_result_as_file = 1
 END


 DROP TABLE tempdb.dbo.Log_Error


上面的代码,可将获取的error信息,以邮件方式发送到指定邮箱。最后要处理的就是在死锁发生时,执行上面的代码。 

SQL 在这里设定一个叫做作业的东东(Job)

作业——(右键)管理作业类别——添加(添加一个:SQL Server 性能警报)



作业——(右键)新建作业


点击步骤——新建


高级




作业建立成功,注意这里没有设定作业执行的时间。 我们的需求是在死锁发生时触发这个作业,所以就需要用到一个叫警报的东东。


警报——(右键)新建警报


响应中


选项中




除此方法外,还可使用SQL Server Profiler 创建跟踪。 以及使用 WMI Provider for Server Events 创建 SQL Server 代理警报







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值