<强> 强>
,
在部署了数据库镜像之后,我们需要监控参与镜像的主数据库和镜像数据库的状态,如果状态异常,发送告警邮件。那么这个脚本需要在主和镜像服务器上都运行。
,
目录视图系统。database_mirroring对SQL Server实例上的每个数据库都包含一行(包括系统数据库和未配置镜像的数据库),当然也包含所有镜像数据库的状态信息。我们可以查询该目录视图,对于每个异常状态的镜像数据库触发告警邮件。笔者的环境配置的是异步镜像,依赖于手动故障转移。
,
<强>前提条件:强>
1。配置好数据库邮件,有正确的概要。
2。有权限发送邮件的有效登录,需要是msdb数据库中DatabaseMailUserRole角色成员。
3。一对用于监控的镜像数据库。
,
申报的东西 @state VARCHAR (30) 声明 INT @DbMirrored 声明 INT @DbId 声明 @String VARCHAR (100) 声明 @databases TABLE (DBid , INT, mirroring_state_desc VARCHAR (30)) ——,get status  for mirrored 数据库 插入 @databases 选择 database_id, mirroring_state_desc 从 sys.database_mirroring 在哪里 mirroring_role_desc 拷贝(“本金”,“镜子”) 和 mirroring_state_desc NOT 拷贝(“同步”、“同步”) ——,iterate through  mirrored databases 以及send email 警报 而 EXISTS (SELECT TOP 1, DBid 得到@databases WHERE mirroring_state_desc IS NOT 零) 开始 SELECT TOP 1, @DbId =, DBid,, @State =mirroring_state_desc 得到@databases SET @string =,”主持人:,“+ @@servername +‘。’+演员(DB_NAME (@DbId), AS VARCHAR) +,的,安康;DB  Mirroring is “+ @state +的DBA,安康;notify EXEC msdb.dbo.sp_send_dbmail “valid_mail_profile”,“DBA@xxx.com”, @body =, @string,, @subject =@string DELETE 得到@databases WHERE DBid =@DbId 结束 ——also alert  if there  is no mirroring just 拷贝case there should be mirroring :) 选择 @DbMirrored =, COUNT (*) 从 sys.database_mirroring 在哪里 mirroring_state IS  NOT NULL 如果 @DbMirrored =0 开始 SET @string =,”主持人:,“+ @@servername +”,安康;No  databases 断开连接;mirrored 提醒却;能够server 作用;notify DBA的 EXEC msdb.dbo.sp_send_dbmail “valid_mail_profile”,“DBA@xxx.com”, @body =, @string,, @subject =@string 结束
,
依赖于手动故障转移。将以上脚本放到主服务器和镜像服务器上的作业里,每5分钟执行一次。
收到邮件效果如下: