SQL Server数据库镜像基于可用性组故障转移sql
微软从SQL Server 2005开始引入数据库镜像,很快成为一个流行的故障转移解决方案。数据库镜像的一个大的问题是故障转移是基于数据库级别的,所以,若是某个数据库故障,镜像只会针对这个数据库切换,可是,其余数据库都仍然在主服务器上。缺点是愈来愈多的应用程序是基于多个数据库来构建,因此,若是某一个数据库故障转移而其余数据库仍然在主服务器上,那应用程序将没法工做。当这种状况发生的时候,我如何知晓?并执行该应用程序调用的全部数据库一块儿故障转移呢?数据库
在SQL Server的全部功能中,有一种方式能够在数据库镜像故障发生时获得告警或者检查发生的事件。用于数据库镜像的事件提醒并不如你想象的那样直接,但它能够实现该功能。服务器
对于数据库镜像,你能够选择使用跟踪事件,或者配置SQL Server告警来检查对于数据库镜像状态的改变的WMI(Windows Management Instrumentation)事件。ide
在开始以前,咱们须要一些准备工做:spa
镜像数据库和msdb数据库必需启用service broker。可使用以下查询来检查:代理
SELECT name, is_broker_enabled FROM sys.databases
若是service broker的值不为1,你能够对每一个数据库使用如下命令开启。blog
ALTER DATABASE msdb SET ENABLE_BROKER
若是SQL Server代理正在运行,那么这个命令将不会完成。你须要先中止SQL Server代理,运行以上命令,而后再次启动SQL Server代理。事件
最后,若是SQL Server代理没有运行,你须要启动它。ip
建立告警ci
首先,咱们来建立告警,与其余告警不一样的是,咱们会选择”WMI event alert“类型。
使用SSMS链接到实例,展开SQL Server Agent,在Alerts上点击右键,选择“New Alert“。
弹出”New Alert“界面,选择“WMI event alert”。须要注意一下查询的Namespace。默认,SQL Server会根据你操做的实例选择正确的名称空间。
对于Query,使用如下查询:
SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 7 OR State = 8
该数据从WMI获取,当数据库镜像状态变为7(手动故障转移)或8(自动故障转移)时,将会触发做业或者提醒。
此外,你能够进一步对于每个特定的数据库定义查询:
SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 8 AND DatabaseName = 'Test'
能够阅读下联机帮助中DATABASE_MIRRORING_STATE_CHANGE的内容。
如下是能够被监控到的不一样状态改变的列表。更多内容,能够从Database Mirroring State Change Event Class里找到。
0 = Null Notification
1 = Synchronized Principal with Witness
2 = Synchronized Principal without Witness
3 = Synchronized Mirror with Witness
4 = Synchronized Mirror without Witness
5 = Connection with Principal Lost
6 = Connection with Mirror Lost
7 = Manual Failover
8 = Automatic Failover
9 = Mirroring Suspended
10 = No Quorum
11 = Synchronizing Mirror
12 = Principal Running Exposed
13 = Synchronizing Principal
在Response界面,能够配置当事件发生时如何处理。你能够配置当告警触发时执行一个做业,或者给操做者发送一个提醒。
最后,以下所示能够配置额外的选项。
配置示例
例如,一个应用程序有调用3个数据库(Customer、Orders和Log),若是其中一个数据库自动切换,你也想要两外两个数据库也一块儿故障转移。此外,这个镜像配置了一个见证服务器,若是发生故障,会自动故障转移。
如下展现了如何配置。
首先,咱们只针对这3个数据库配置告警。
而后配置告警触发后运行哪一个做业。
咱们须要建立“Failover Databases”做业,用于当告警触发的时候运行。
对于SQL Server代理的“Failover Databases”做业,做业步骤以下:
IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Customer' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Customer SET PARTNER FAILOVER GO IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Orders' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Orders SET PARTNER FAILOVER GO IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Log' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Log SET PARTNER FAILOVER GO
以上的ALTER DATABASE命令对其余没有自动转移的数据库强制故障转移。这跟你再GUI界面上点击“Failover”是同样的。
参考: