使用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