SQL Server 死锁的告警监控
今天这篇文章总结一下如何监控SQL Server的死锁,其实以前写过MS SQL 监控错误日志的告警信息,这篇文章着重介绍如何监控数据库的死锁,当然这篇文章不分析死锁产生的原因、以及如何解决死锁。死锁(Dead Lock)的错误信息在sys.messages中的message_id为1205,可以使用下面SQL查看。
SELECT * FROM sys.messages WHERE message_id=1205
那么接下来,我们来设置一下死锁(Dead Lock)告警吧, 如下所示,当然你可以使用UI界面设置。
USE [msdb]
GO
IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)
BEGIN
EXEC msdb.dbo.sp_add_category
@class=N'ALERT',
@type=N'NONE',
@name=N'DBA_MONITORING' ;
END
GO
IF EXISTS(SELECT 1 FROM msdb.dbo.sysalerts WHERE name='SQL Server Dead Lock Detected')
BEGIN
EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Dead Lock Detected';
END
GO
IF NOT EXISTS(SELECT 1 FROM msdb.dbo.sysalerts WHERE name='SQL Server Dead Lock Detected')
BEGIN
EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Dead Lock Detected',
@message_id=1205,
@severity=0,
@enabled=1,
@delay_between_responses=0,
@include_event_description_in=1,
@category_name=N'DBA_MONITORING',
@job_id=N'00000000-0000-0000-0000-000000000000'
END
GO
IF NOT EXISTS ( SELECT *
FROM msdb.dbo.sysnotifications
WHERE alert_id = ( SELECT id
FROM msdb.dbo.sysalerts
WHERE name = 'SQL Server Dead Lock Detected'
) )
BEGIN
EXEC msdb.dbo.sp_add_notification @alert_name = N'SQL Server Dead Lock Detected',
@operator_name = N'YourSQLDba_Operator', @notification_method = 1;
END;
GO
执行上面脚本后,就会在SQL Server的告警里面新增一个名为SQL Server Dead Lock Detected'的告警,那么现在是否OK了呢?当然不是,我们来测试验证一下吧,首先准备测试的表和数据。
USE YourSQLDba;
GO
CREATE TABLE DEADLOCK1(ID INT DEFAULT(0));
CREATE TABLE DEADLOCK2(ID INT DEFAULT(0));
INSERT INTO DEADLOCK1 VALUES(1);
INSERT INTO DEADLOCK2 VALUES(1);
GO
如下所示,在两个会话窗口执行下面脚本,构造死锁出现的场景。
--会话窗口1执行下面SQL
BEGIN TRAN
UPDATE DEADLOCK1 SET ID=ID+1;
WAITFOR DELAY '00:00:20';
SELECT * FROM DEADLOCK2
ROLLBACK TRAN;
EXEC master..sp_altermessage 1205, 'WITH_LOG', TRUE;
GO
--会话创建2执行下面SQL
BEGIN TRAN
UPDATE DEADLOCK2 SET ID=ID+1;
WAITFOR DELAY '00:00:20';
SELECT * FROM DEADLOCK1
ROLLBACK TRAN;
如下截图所示,当死锁出现后,那么这个告警设置是否会发送邮件出来呢? 答案是否定的,你可以检查告警的历史情况,如下所示:
从History界面,我们可以看到这个告警没有被触发,那么这个是什么原因呢?原因其实很简单,因为message_id为1205的消息字段is_event_logged默认是0,这意味着出现错误消息将不会记入事件日志。我们可以使用小SQL将其值设置为1
EXEC master..sp_altermessage 1205, 'WITH_LOG', TRUE;
GO
执行上面脚本后,message_id为1205的记录的is_event_logged字段值将被设置为1,当数据库出现死锁时,就会被记录到错误日志,当然这个只是简单消息的记录,如果你要跟踪、解决死锁问题,就需要记录死锁的详细信息,需要在服务端针对所有的Session开启Trace flag 1222。
DBCC TRACEON(1222,-1);
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【算法】斐波那契数列
主要内容: 斐波那契数列(兔子问题) 递归算法和递推算法 斐波那契数列(兔子问题) 问题描述:刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。假设兔子没有死亡,每代兔子都可以正常繁殖下一代,那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月) 观察可知,从第三月开始,每个月的兔子总量等于前两个月的兔子总量之和,由此,便很容易确定其可以用斐波那契数列的思路来解决。 公式:Fib(n)=Fib(n-1)+Fib(n-2),n>3 现在来使用代码实现,我使用的是java来实现 递归算法和递推算法 package lucas; import java.util.Scanner; /**兔子问题<br/> * 问题描述:<br/> * 刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。<br/> * 假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。<br/> *...
- 下一篇
Java 数组 之 一维数组 冒泡排序算法
http://www.verejava.com/?id=16992682424030 /** 用冒泡算法:将成绩arrays 从小到大排序输出 思路: 第一趟排序 1. 将数组中n个元素从第一个元素开始 一一跟后面的元素比较 2. 如果前面的数据比后面的数据大, 两个交换位置直到一次循环完成,那么数组中最大的数据将会排在数组的最后一个位置。 第 i 趟排序 3. 依次类推, 将剩下未排序的n-i个元素再类似 1,2过程一遍,这样直到循环 n次结束后,数组中的元素就是从小到大排好序了. 注意: 只需要经过 n-1趟排序 */ public class BubbleSort { public static void sort(int[] arrays) { //第一个循环控制n-1趟排序 for (int i = 0; i < arrays.length - 1; i++) { //第二个循环控制每次要比较的元素个数n-1 for (int j = 0; j < arrays.length - i - 1; j++) { if (arrays[j] > arrays[j ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群