设为首页 收藏本站
查看: 1142|回复: 0

[经验分享] SQL Server数据库镜像基于可用性组故障转移

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-15 09:48:55 | 显示全部楼层 |阅读模式
SQL Server数据库镜像基于可用性组故障转移

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

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

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

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

镜像数据库和msdb数据库必需启用service broker。可以使用如下查询来检查:
1
2
SELECT name, is_broker_enabled
FROM sys.databases




如果service broker的值不为1,你可以对每个数据库使用以下命令开启。
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“。
wKiom1jHlPrThJNDAAAf2S9mxqE042.jpg

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

对于Query,使用以下查询:
1
SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 7 OR State = 8




该数据从WMI获取,当数据库镜像状态变为7(手动故障转移)或8(自动故障转移)时,将会触发作业或者提醒。

此外,你可以进一步对于每一个特定的数据库定义查询:
1
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界面,可以配置当事件发生时如何处理。你可以配置当告警触发时执行一个作业,或者给操作者发送一个提醒。
wKioL1jHlPzS62NsAABoTkK81x4539.jpg

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

配置示例

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

以下展示了如何配置。

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

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

我们需要创建“Failover Databases”作业,用于当告警触发的时候运行。

对于SQL Server代理的“Failover Databases”作业,作业步骤如下:
1
2
3
4
5
6
7
8
9
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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-351389-1-1.html 上篇帖子: 如何处理SQL Server事务复制中的大事务操作 下篇帖子: 监控SQL Server数据库异常镜像状态发告警邮件 数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表