对于DBA,死锁有时是件很让人头痛的事。往往用户反映说系统卡死了,半天没反应,这时我们去查看活动监视器(Activity Monitor),或通过T-SQL(可参考这里),或通过Trace等手段,发现数据库发生死锁了。当系统发生死锁时,有没有办法让系统就立即触发并发mail通知相关死锁信息呢?答案是有的。实现之前要确保两件事情:

  • 开启死锁跟踪标志
  • 数据库邮件已配置并且能正常工作(这部分可以参考我之前的Blog)

下面介绍一下如何开启死锁跟踪标志

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

标志的含义如下:
3605:将DBCC的结果输出到错误日志
1204:返回参与死锁的锁的资源和类型,以及受影响的当前命令。
作用域:仅全局
1222:以不符合任何 XSD 架构的 XML 格式,返回参与死锁的锁的资源和类型,以及受影响的当前命令。
作用域:仅全局
更多关于TRACEON的信息可参考MSDN,跟踪标志可参考MSDN。

重要提示:这种设置跟踪标志的方式在SQL Server重启后将不再有效,如果要保证SQL Server运行时总是开启,你可以使用-T启动选项(可参考MSDN)或创建一个SQL Server代理作业,当代理启动时自动开启。关闭跟踪标志可执行:DBCC TRACEOFF(3605,1204,1222,-1)

接下来,看看如何抓取死锁信息并发Mail,相关Script如下:

--创建临时表
IF OBJECT_ID('tempdb.dbo.ErrorLog') IS Not Null
BEGIN
DROP TABLE tempdb.dbo.ErrorLog
END
CREATE TABLE tempdb.dbo.ErrorLog (Id int IDENTITY (1, 1) NOT NULL,
logdate DATETIME, procInfo VARCHAR(10), ERRORLOG VARCHAR(MAX))
--向临时表插入错误日志信息
INSERT INTO tempdb.dbo.ErrorLog
EXEC master.dbo.sp_readerrorlog
--过滤错误日志信息并将死锁信息发出mail
BEGIN
declare @servername nvarchar(150)= @@servername
declare @mysubject nvarchar(200) = 'Deadlock event notification on server '+@servername+'.'
--发mail
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Local DBA',
@recipients='Burgess.Liu@quantacn.com',
@subject = @mysubject,
@body = 'Deadlock has occurred. View attachment to see the deadlock info',
@query = 'select logdate, procInfo, ERRORLOG from tempdb.dbo.ErrorLog where Id >= (select TOP 1 Id from tempdb.dbo.ErrorLog WHERE ERRORLOG Like ''%Deadlock encountered%'' order by Id DESC)',
@query_result_width = 600,
@attach_query_result_as_file = 1
END
--Drop临时表
DROP TABLE tempdb.dbo.ErrorLog 

为了在发生死锁时就触发发出mail,我们可以使用SQL代理作业,这里只提供Script:

USE [msdb]
GO
/****** Object:  Job [Deadlock Job]    Script Date: 2012/5/28 12:05:21 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 2012/5/28 12:05:21 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Deadlock Job',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [Deadlock has occurred.]    Script Date: 2012/5/28 12:05:22 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Deadlock has occurred.',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'--创建临时表
IF OBJECT_ID(''tempdb.dbo.ErrorLog'') IS Not Null
BEGIN
DROP TABLE tempdb.dbo.ErrorLog
END
CREATE TABLE tempdb.dbo.ErrorLog (Id int IDENTITY (1, 1) NOT NULL,
logdate DATETIME, procInfo VARCHAR(10), ERRORLOG VARCHAR(MAX))
--向临时表插入错误日志信息
INSERT INTO tempdb.dbo.ErrorLog
EXEC master.dbo.sp_readerrorlog
--过滤错误日志信息并将死锁信息发出mail
BEGIN
declare @servername nvarchar(150) = @@servername
declare @mysubject nvarchar(200) = ''Deadlock event notification on server ''+@servername+''.''
--发mail
EXEC msdb.dbo.sp_send_dbmail @recipients=''DBA_Super_Hero@email.com'',
@subject = @mysubject,
@body = ''Deadlock has occurred. View attachment to see the deadlock info'',
@query = ''select logdate, procInfo, ERRORLOG from tempdb.dbo.ErrorLog where Id >= (select TOP 1 Id from tempdb.dbo.ErrorLog WHERE ERRORLOG Like ''''%Deadlock encountered%'''' order by Id DESC)'',
@query_result_width = 600,
@attach_query_result_as_file = 1
END
--== Clean up our process by dropping our temporary table. ==--
DROP TABLE tempdb.dbo.ErrorLog
',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO

最后,设置作业的警报(Alert),可参考下图:

到此,任务完成,下次当数据库发生死锁时,你就可以收到相关的死锁信息,如下图:

发生死锁时自动发mail相关推荐

  1. 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法

    在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 参考文章: (1)在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 (2)https://www.cnbl ...

  2. 求多个进程并发运行时,不发生死锁时的最少共享资源数

    案例: 某系统中有 3 个并发进程竞争资源 R,每个进程都需要 5 个 R,那么至少有( )个 R,才能保证系统不会发生死锁. A.12 B.13 C.14 D.15 解题思路 找出发生死锁的临界资源 ...

  3. python爬虫程序自动结束-在linux下python爬虫进程发生异常时自动重启直至正常结束的方法...

    之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在urlopen时会因为无法正常连接而报URLError或者timeout的错误导致陈序报错而终止:但是这些错误在重新运行陈序后能 ...

  4. 线上发生死锁异常了,该怎么办

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  5. 死锁的概念以及发生死锁的缘由

    死锁的界说 在多道程序零碎中,因为多个过程的并发履行,改良了零碎资本的应用率并进步了零碎 的处置才能.但是,多个过程的并发履行也带来了新的成绩--死锁.所谓死锁是指多个进 程因竞争资本而形成的一种僵局 ...

  6. Linux中使用Msmtp+mutt+shell自动发邮件程序安装说明

    Linux中使用Msmtp+mutt+shell自动发邮件程序安装说明 ------by liyoujia 环境: 需要用到mutt 和 msmtp 这两款软件 Mutt:linux初始化安装的时候自 ...

  7. pthread 线程退出时自动释放资源

    线程退出时自动释放资源 今天碰到一个问题:主线程pthread_create一个子线程A,子线程pthread_mutex_lock,然后调用其他的函数fun,最后从fun返回后再pthread_mu ...

  8. linux关闭自检测进程,CentOS下自动发邮件检测某进程是否存在

    目的:利用shell脚本每小时检测数据库是否在运行,当检测到库宕掉时发邮件告警. 1.检查sendmail是否在运行 service sendmail status 没有在运行则启动或安装. 如果是l ...

  9. 多程序同时操作 mysql_关于多个程序同时操作一个表发生死锁的问题

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

最新文章

  1. 【设计模式】—— 职责链模式ChainOfResponsibility
  2. USACO 3.1 Agri-Net 最短网络 (最小生成树)(普里姆算法)
  3. jQuery 实现上下,左右滑动
  4. [渝粤教育] 湘潭大学 土力学 参考 资料
  5. 大数据学习——mapreduce共同好友
  6. 《解密家用路由器0day漏洞挖掘技术》学习笔记
  7. python 基于模板生成ppt_【Python3】通过模板实现PPT的自动生成
  8. 胖客户端、瘦客户端与智能客户端
  9. 在支付宝中开通信用卡快捷支付
  10. 利用支付宝短信服务接口 实现手机号 验证码登录Demo
  11. 2020年医美行业网络关注度分析报告
  12. Shapely的安装
  13. 对学姐的U-net网络的学习杂记
  14. 情人节程序员用HTML网页表白【全屏3D相册】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  15. 金融安全:谁忽略了移动应用加密?
  16. mysql中floa类型数据和mysql命令
  17. html空白字符显示效果,什么是空白字符?空白符有哪些?
  18. 数字经济-新经济指数(2017-2022)31省数字经济测算(2013-2020)两大维度指标
  19. 内蒙古商贸职业学院校计算机系,内蒙古商贸职业学院计算机系.doc
  20. Laravel后端接口使用mews/captcha验证码注册+登录流程讲解

热门文章

  1. 二叉树的深度 | 分治 +回溯 + 迭代
  2. SD卡读卡程序 C语言 IO模拟,单片机SD卡读卡器仿真+源程序+电路原理图
  3. Web 利用纯html和css画出一个android机器人
  4. 10-123 A3-3查找产品表中最低的单价
  5. c2-00支持java_双卡超长待机 经典实用诺基亚C2-00图赏
  6. IT30: IT人为什么那么有毅力
  7. Python中tkinter库
  8. C# 调用Everything查找文件
  9. 面对中小型机房动力环境该如何实现监控?
  10. php怎么弄三角形,css中怎么设置三角形