使用sp_dbmmonitorresults来监控镜像
配置
首先,在msdb数据库执行存储过程sp_dbmmonitoraddmonitoring。这个系统存储过程在SQL Server代理新建一个定期更新镜像数据库信息的作业“Database Mirroring Monitor Job”。
使用以下脚本在每个镜像服务器上执行:
USE msdb; GO EXEC sp_dbmmonitoraddmonitoring; GO
你可以指定更新间隔(分钟)。此值可以是介于 1 到 120 分钟之间的值。 默认值为 1 分钟。
完成后,你可以使用sp_dbmmonitorresults快速拉取镜像状态数据。你可以指定结果返回的行数。默认为最后1行。还可以指定返回结果前是否更新状态。
可以使用以下脚本返回镜像状态数据。
EXEC sys.sp_dbmmonitorresults @database_name = 'InsertDatabaseNameHere', -- sysname @mode = 0, -- int @update_table = 0 – int
当前镜像的状态
为了获取1个数据库当前镜像的状态,你可以查询mirror_state列的值。你可以根据该值来配置如果状态异常时发出告警。查询如下:
DECLARE @MonitorResults AS TABLE ( database_name VARCHAR(255), role INT, mirror_state TINYINT, witness_status TINYINT, log_generat_rate INT, unsent_log INT, sent_rate INT, unrestored_log INT, recovery_rate INT, transaction_delay INT, transaction_per_sec INT, average_delay INT, time_recorded DATETIME, time_behind DATETIME, local_time DATETIME); INSERT INTO @MonitorResults EXEC sp_dbmmonitorresults @database_name = 'InsertDatabaseNameHere', @mode = 0, @update_table = 0; SELECT mirror_state FROM @MonitorResults;
可以返回的值为:
0=Suspended
1=Disconnected
2=Synchronizing
3=Pending Failover
4=Synchronized
如果你配置了一个告警,检查小于2的值,你就可以知道镜像下线。
数据库当前角色
在镜像配置后,你可以跟踪给定数据库的角色。如果你总是想让某台服务器为主,那你可以修改以下查询来检查角色:
DECLARE @MonitorResults AS TABLE ( database_name VARCHAR(255), role INT, mirror_state TINYINT, witness_status TINYINT, log_generat_rate INT, unsent_log INT, sent_rate INT, unrestored_log INT, recovery_rate INT, transaction_delay INT, transaction_per_sec INT, average_delay INT, time_recorded DATETIME, time_behind DATETIME, local_time DATETIME); INSERT INTO @MonitorResults EXEC sp_dbmmonitorresults @database_name = 'InsertDatabaseNameHere', @mode = 0, @update_table = 0; SELECT role FROM @MonitorResults;
该查询返回值为:
1=Principal
2=Mirror
根据你的监控计划,你可以跟踪到什么时候一个数据库从主切换了。
见证的状态
如果你配置了见证服务器,你也要时刻监控见证服务器的状态,如果见证服务器下线,对镜像数据库的可用性是有影响的。你可以修改以下查询:
DECLARE @MonitorResults AS TABLE ( database_name VARCHAR(255), role INT, mirror_state TINYINT, witness_status TINYINT, log_generat_rate INT, unsent_log INT, sent_rate INT, unrestored_log INT, recovery_rate INT, transaction_delay INT, transaction_per_sec INT, average_delay INT, time_recorded DATETIME, time_behind DATETIME, local_time DATETIME); INSERT INTO @MonitorResults EXEC sp_dbmmonitorresults @database_name = 'InsertDatabaseNameHere', @mode = 0, @update_table = 0; SELECT witness_status FROM @MonitorResults;
返回结果如下:
0=Unknown
1=Connected
2=Disconnected
笔者使用的是异步镜像,没有配置见证,所以值为0。如果配置了见证,可以跟踪它的状态,配置告警,知道什么时候值不为1了。
数据还没有发送到镜像
你可以跟踪等待发送到镜像的数据量。常常被称为发送队列。可以修改如下脚本:
DECLARE @MonitorResults AS TABLE ( database_name VARCHAR(255), role INT, mirror_state TINYINT, witness_status TINYINT, log_generat_rate INT, unsent_log INT, sent_rate INT, unrestored_log INT, recovery_rate INT, transaction_delay INT, transaction_per_sec INT, average_delay INT, time_recorded DATETIME, time_behind DATETIME, local_time DATETIME); INSERT INTO @MonitorResults EXEC sp_dbmmonitorresults @database_name = 'InsertDatabaseNameHere', @mode = 0, @update_table = 0; SELECT unsent_log FROM @MonitorResults;
参考:
sp_dbmmonitoraddmonitoring
https://msdn.microsoft.com/zh-cn/library/ms403582.aspx
sp_dbmmonitorresults
https://msdn.microsoft.com/zh-cn/library/ms366320.aspx