SQL Server数据库镜像基于可用性组故障转移
admin
2023-05-27 05:21:07
0

SQL Server数据库镜像基于可用性组故障转移

 

微软从SQL Server 2005开始引入数据库镜像,很快成为一个流行的故障转移解决方案。数据库镜像的一个大的问题是故障转移是基于数据库级别的,因此,如果某个数据库故障,镜像只会针对这个数据库切换,但是,其他数据库都仍然在主服务器上。缺点是越来越多的应用程序是基于多个数据库来构建,所以,如果某一个数据库故障转移而其他数据库仍然在主服务器上,那应用程序将无法工作。当这种情况发生的时候,我如何知晓?并执行该应用程序调用的所有数据库一起故障转移呢?

 

在SQL Server的所有功能中,有一种方式可以在数据库镜像故障发生时得到告警或者检查发生的事件。用于数据库镜像的事件提醒并不如你想象的那样直接,但它可以实现该功能。

 

对于数据库镜像,你可以选择使用跟踪事件,或者配置SQL Server告警来检查对于数据库镜像状态的改变的WMI(Windows Management Instrumentation)事件。

 

在开始之前,我们需要一些准备工作:

 

镜像数据库和msdb数据库必需启用service broker。可以使用如下查询来检查:

SELECT name, is_broker_enabled
FROM sys.databases

 

如果service broker的值不为1,你可以对每个数据库使用以下命令开启。

ALTER DATABASE msdb SET ENABLE_BROKER

 

如果SQL Server代理正在运行,那么这个命令将不会完成。你需要先停止SQL Server代理,运行以上命令,然后再次启动SQL Server代理。

 

最后,如果SQL Server代理没有运行,你需要启动它。

 

创建告警

 

首先,我们来创建告警,与其他告警不同的是,我们会选择”WMI event alert“类型。

 

使用SSMS连接到实例,展开SQL Server Agent,在Alerts上点击右键,选择“New Alert“。

SQL Server数据库镜像基于可用性组故障转移

 

弹出”New Alert“界面,选择“WMI event alert”。需要注意一下查询的Namespace。默认,SQL Server会根据你操作的实例选择正确的名称空间。

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界面,可以配置当事件发生时如何处理。你可以配置当告警触发时执行一个作业,或者给操作者发送一个提醒。

SQL Server数据库镜像基于可用性组故障转移

 

最后,如下所示可以配置额外的选项。

SQL Server数据库镜像基于可用性组故障转移

 

配置示例

 

例如,一个应用程序有调用3个数据库(Customer、Orders和Log),如果其中一个数据库自动切换,你也想要两外两个数据库也一起故障转移。此外,这个镜像配置了一个见证服务器,如果发生故障,会自动故障转移。

 

以下展示了如何配置。

 

首先,我们只针对这3个数据库配置告警。

SQL Server数据库镜像基于可用性组故障转移

 

然后配置告警触发后运行哪个作业。

SQL Server数据库镜像基于可用性组故障转移

 

我们需要创建“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”是一样的。


参考:

https://msdn.microsoft.com/en-us/library/ms191502.aspx

https://msdn.microsoft.com/en-us/library/ms186449.aspx



相关内容

热门资讯

凤凰连线:为何伊朗称“即使与阿... 据凤凰卫视报道,伊朗知情人士当地时间周三透露称,伊朗与阿曼就霍尔木兹海峡船舶通行安排,可能达成协议,...
伊朗称与阿曼就霍尔木兹海峡航运... 据凤凰卫视报道,伊朗外交部发言人巴加埃5日表示,伊朗与阿曼已就霍尔木兹海峡拟定航道的地理坐标达成一致...
予非知识图谱大模型完成生成式人... 近日,山东省网信办正式公布生成式人工智能服务备案名录,潍坊华创信息技术有限公司自主研发的“予非知识图...
学习语丨人工智能应该是造福全人... 近日,习近平总书记向2025世界智能产业博览会致贺信,指出:“人工智能应该是造福全人类的国际公共产品...
2026年交易全链路可追溯的智... 2026-08-05 12:10:48 作者:狼叫兽 2026年被视作智能体支付规模化落地的关键之年...
百余名中外专家齐聚海西 共话人... 8月4日,人工智能赋能的天文学开放科学会议(第二届)在青海省海西州盛大启幕。来自中国、美国、英国、法...
“私自评大师的机构”,也被撤了 曾经披着“大师”外衣四处走穴的人,正在纷纷退场。2026年以来,多个行业协会宣布撤销此前授予的“大师...
2026南昌家用呼吸机坏了去哪... 家用无创呼吸机属于精密二类医疗器械,长期昼夜连续运行,随着使用时间推移,有可能出现报警、噪音变大、无...
演习首日发生意外事故:台空军一... 【环球网报道 记者 徐思琦】据中时新闻网、中天新闻网等台媒8月5日报道,台军所谓“汉光42号演习”首...
奥运冠军陆春龙挂职担任苏州大学... 澎湃新闻记者 岳怀让近日,苏州大学体育学院官网“现任领导”栏目更新信息显示,陆春龙已经挂职担任苏州大...