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

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“。

弹出”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”是一样的。

参考:

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

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

时间: 2024-10-02 20:03:55

SQL Server数据库镜像基于可用性组故障转移的相关文章

SQL Server数据库镜像关键性能计数器

SQL Server数据库镜像关键性能计数器 监视数据库镜像基本有以下5种方法: 1. 配置数据库镜像监视器.设置告警阈值. 2. 配置WMI EVENT ALERT,配置镜像状态修改后的动作或告警. 3. 使用系统监视器查看关键性能计数器. 4. 部署作业监控异常镜像状态,发送告警. 5. 使用sp_dbmmonitorresults获取镜像数据. 当然,使用扩展事件和SQL Server Profiler也能监控到数据库事件中的数据库镜像状态修改.这种工具主要用于跟踪,而非监控的常规手段.

SQL Server数据库镜像的页面自动修复原理

SQL Server数据库镜像的页面自动修复原理 主库页面损坏 镜像库页面损坏 LSN用来保证事务的时序 LSN保存在数据页面头,主库的LDF文件,镜像库的LDF文件,那么在这三者就搭起了一条沟通的桥梁 大家通过对比LSN来得知大家的数据是否一致 在分布式数据库领域,也是需要保证事务时序的,也是通过LSN 有些数据库例如Oracle用的是SCN来保证各个分布数据库的时序,保证各个数据库的数据一致 其实无论是分布式领域还是非分布式领域都是一样,分布式领域也没有太多高大上的东西,都是一样要保证数据一

从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html 第二篇http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Wind

SQL Server数据库镜像的FailOver自动连接

SQL Server配置数据库镜像后,可能有朋友们会比较有疑惑,你一下搞两个数据库出来,他们的ip地址都不一样,到时候数据库切换过去了,我的数据库的连接字符串可如何是好?难道还得在代码中去控制是连接哪个数据库吗? 其实这个问题是这样的,使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示: ConnectionString="DataSource=A;FailoverPartner=B;Initial Catalog=AdventureWor

(转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Windows Server2012系统配置指南> 四种集群的仲裁配置: 1.多数节点:这种配置不会用到仲裁磁盘,而所谓多数节点就是在正常节点数量占多数的情况下,集群才会提供

SQL Server数据库镜像搭建(无见证无域控)

1. 环境配置服务器1:sqlmirror01 IP:192.168.10.176服务器2:sqlmirror02IP:192.168.10.177操作系统:Windows 2012 R2安装 .Net Framework 3.5/4.0关闭服务器防火墙或设置白名单数据库版本:SQL Server 20142. 创建主密钥(非必需)use mastergocreate master key encryption by password='zaq12WSX'go3. 创建证书sqlmirror01

如何还原SQL Server 数据库到Always On可用性组

问题描述 ============== 如何还原SQL Server 数据库到AlwaysOn可用性组 问题解答 ==============我们无法在一个可用组的数据库上执行还原操作,如果需要的话,我们必须从可用性组中删除数据库然后再还原和重新配置.它与您在镜像或日志传送方案中所使用的类似. 下面是相关的步骤去还原SQL Server数据库到AlwaysOn可用性组 步骤1: 从可用性组中删除数据库 1)在新的主服务器上,扩展可用性组的可用性数据库的列表. 2)右键单击要还原的数据库,然后选择

监控SQL Server数据库异常镜像状态发告警邮件

监控SQL Server数据库异常镜像状态发告警邮件 在部署了数据库镜像之后,我们需要监控参与镜像的主数据库和镜像数据库的状态,如果状态异常,发送告警邮件.那么这个脚本需要在主和镜像服务器上都运行. 目录视图sys.database_mirroring对SQL Server实例上的每个数据库都包含一行(包括系统数据库和未配置镜像的数据库),当然也包含所有镜像数据库的状态信息.我们可以查询该目录视图,对于每个异常状态的镜像数据库触发告警邮件.笔者的环境配置的是异步镜像,依赖于手动故障转移. 前提条

SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid不正确、数据库日志文 件丢失

客户名称:深圳某科技信息有限公司 数据库类型:sql2000 数据库大小:20g 故障经过 电脑突然断电,软件就显示某数据库错误,无法连接,打开企业管理器,显示数 据库质疑,DBCC查询显示" SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid不正确.数据库日志文件丢失". 处理经过 客户找到我们,然后我们让客户把数据库压缩发给我们,首先我们先对数据进行 检测分析,确定是" I/O 错误 ",然后我们就开始用我们的修复工具对数据进 行全面性的分