天天看点

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

最近熬出病来了,都说IT行业伤不起,不说了,说回今天的正题

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

正题

上个月月底的时候因为要搬迁机房,需要将一个数据信息数据库先搬到我们的机房,然后将客户的数据库

从原来的机房A搬到机房B,原来我们的数据信息库(DataInfo)是放在机房A的,但是为了以后方便和防止信息泄露

就放到我们的托管机房,这里叫机房C

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

在搬迁机房的时候,尽量减少宕机时间,数据不能丢,搬迁机房真是一门学问。。。

虽然这麽忙,但我还是把写文章的时间腾出来,把干货分享给大家o(∩_∩)o 

因为很多系统都在读写机房A的数据信息库(DataInfo),我在上个月底的时候用备份文件初始化的方式搭建好复制把机房A的

机房A的数据信息库(DataInfo)新插入的数据实时复制到机房C,先让一部分系统能读取机房C的数据信息库(DataInfo),

等以后搬迁完所有系统之后再统一全部改连接地址

当然这篇文章不是讲我这次的搬迁过程,在搭建好复制之后,由于我没有设置订阅库的登录用户的权限为只读,导致前几天开发那边

同时把新数据插入到订阅库,导致复制失败(主键重复),分发命令积压(大概26w+条命令未分发),然后一大堆后续工作。。。。。。

复制的坑其实挺多的,因为我们不可能24小时用肉眼盯着复制监视器,所以我们需要一些监控手段,

当遇到复制出错的时候可以尽快知道然后进行修复

监控考虑的条件:

(1)单个点监控、多个点监控

(2)购买、自己开发

(3)比较实时、不是很实时

(4)数据库服务器是否负载过高

我这里只考虑最简单的一种:单个点的,不需要很实时,负载不高,如果服务器负载过高有可能连邮件也发不出了

然后就考虑到使用SQLSERVER自带的数据库邮件来发告警邮件

当然,如果需要同时满足实时、多个点监控、成本足够可以考虑购买成熟的解决方案

又或者

自己公司开发监控程序,支持短信告警更加及时

需求

(1)当遇到复制出错的时候发邮件到我的邮箱

(2)每天间隔一定时间发邮件告诉我当前复制的情况

测试环境:Windows7 64位 、发布库SQL2005 SP4 、订阅库SQL2012 SP1、发布库和订阅库都在我的笔记本上

复制所用登录用户:[ReplicationUser]

在进行实验之前,需要测试一下smtp.163.com,端口为25,这个地址是否可以访问。如果不通有可能是你机器防火墙的问题

还有可能需要检查杀毒软件有没有屏蔽了端口,否则会发送邮件失败

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

呈上完整脚本

测试结果

手动启动作业,就可以看到邮件会自动发到我的163邮箱

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

复制报错的时候也会发邮件

我把复制用户的权限去掉,马上就会报错

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

SQLSERVER会有一个重试时间,除非你马上停止同步,否则SQLSERVER会不断重试,然后不断发邮件到你的邮箱提醒你~

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

把权限勾上后,没有报错了,也没有再发邮件了

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

分发代理默认是每隔一分钟重试4次

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件
SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

你会看到每隔一分钟会收到4封邮件,其中有一封邮件是空的

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

而且大家可以看一下[MSrepl_errors]表,每分钟会插入三条记录到[MSrepl_errors]表这些都是重试记录

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

暂时还不清楚可以在哪里修改每分钟的重试次数,还有为什么4封邮件中有一封是空的~

原理

(1)对[distribution].[dbo].[MSrepl_errors]表创建了insert触发器,当有错误的时候,SQLSERVER会向这个表插入错误记录

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

(2)利用job获取下面的两个存储过程的结果监视复制发送邮件,这两个存储过程都在分发数据库里

 sp_replcounters    --为每个发布数据库返回有关滞后时间、吞吐量和事务计数的复制统计信息。 此存储过程在发布服务器的任何数据库中执行。

 sp_replmonitorsubscriptionpendingcmds  -- 返回有关对事务发布的订阅的等待命令数以及处理这些命令的粗略估计时间的信息。

此存储过程针对每个返回的订阅返回一行。 在分发服务器的分发数据库上执行此存储过程,用于监视复制。

SQLSERVER监控复制并使用数据库邮件功能发告警邮件SQLSERVER监控复制并使用数据库邮件功能发告警邮件

感谢群里面的复制大牛:何文通、高文佳、菠萝的帮助

相关文章

<a href="http://www.cnblogs.com/fygh/archive/2011/07/04/2097405.html" target="_blank">SQLServer Replication 常见错误</a>

<a href="http://www.cnblogs.com/TeyGao/p/3611318.html" target="_blank">Replication--复制延迟的诊断和解决</a>

<a href="http://www.cnblogs.com/TeyGao/p/3521130.html" target="_blank">Replication--复制Token</a>

<a href="http://www.cnblogs.com/diabloxl/p/3630410.html" target="_blank">Replication的犄角旮旯(四)--关于事务复制的监控</a>

<a href="http://www.cnblogs.com/gaizai/p/3358958.html" target="_blank">SQL Server 创建数据库邮件</a>

如有不对的地方,欢迎大家拍砖o(∩_∩)o