适用于:SQL Server
本主题说明如何在 SQL Server 中使用 SQL Server Management Studio、Transact-SQL 或 PowerShell 对 Always On 可用性组执行手动故障转移而不丢失数据(计划的手动故障转移)。 可用性组按可用性副本级别进行故障转移。 计划的手动故障转移类似于所有 Always On 可用性组的故障转移,将次要副本转换为主要角色。 故障转移同时会将先前的主要副本转换为次要角色。
仅当主副本和目标次要副本以同步提交模式运行且当前处于同步状态时,才支持计划的手动故障转移。 计划的手动故障转移会保留已加入目标辅助副本上的可用性组的辅助数据库中的所有数据。 将以前的主要副本转换为次要角色后,其数据库将成为辅助数据库。 然后它们开始与新的主数据库同步。 在它们全部转换到 SYNCHRONIZED 状态后,新的辅助副本将有资格作为未来计划内手动故障转移的目标。
注意
如果次要副本和主要副本都配置为自动故障转移模式,那么同步次要副本后,该副本还可以用作自动故障转移的目标。 有关详细信息,请参阅可用性模式(Always On 可用性组)。
在开始之前
重要
对于没有群集管理器的读扩展可用性组,可通过特定过程执行故障转移。 当可用性组具有 CLUSTER_TYPE = NONE 时,请按照 对读取扩展可用性组上的主副本执行故障转移 中的步骤操作。
限制和局限
故障转移命令在目标辅助副本接受该命令后立即返回。 但是,在可用性组完成故障转移之后,数据库恢复操作将以异步方式执行。
故障转移时,可能不维护可用性组中数据库间的跨数据库一致性。
注意
对跨数据库和分布式事务的支持因 SQL Server 和操作系统版本而异。 有关详细信息,请参阅用于 Always On 可用性组和数据库镜像的跨数据库事务和分布式事务 (SQL Server)。
先决条件和限制
目标次要副本和主要副本必须同时在同步提交可用性模式下运行。
目标次要副本当前必须与主要副本同步。 此次要副本上的所有次要数据库都必须加入到可用性组。 它们还必须与各自主数据库保持同步(也就是说,本地次要数据库必须处于 SYNCHRONIZED 状态)。
提示
要确定次要副本的故障转移就绪状态,请查询动态管理视图 sys.dm_hadr_database_replica_cluster_states 中的 is_failover_ready 列。 或者,您可以查看 Always On 组仪表板中的 “故障转移准备情况”列。
该任务仅在目标辅助副本上受支持。 您必须连接到承载目标辅助副本的服务器实例。
安全性
权限
可用性组上需要 ALTER AVAILABILITY GROUP 权限。 还需要 CONTROL AVAILABILITY GROUP 权限、ALTER ANY AVAILABILITY GROUP 权限或 CONTROL SERVER 权限。
使用 SQL Server Management Studio
若要手动对可用性组执行故障转移:
在对象资源管理器中,连接到承载需要故障转移的可用性组某个次要副本的服务器实例。 展开服务器树。
展开 Always On 高可用性 节点和 可用性组 节点。
右键单击要进行故障转移的可用性组,然后选择故障转移。
“故障转移可用性组向导”随即启动。 有关详细信息,请参阅使用故障转移可用性组向导 (SQL Server Management Studio)。
使用 Transact-SQL
若要手动对可用性组执行故障转移:
连接到承载目标辅助副本的服务器实例。
使用 ALTER AVAILABILITY GROUP 语句,如下所示:
ALTER AVAILABILITY GROUP group_name 故障
在该语句中,group_name 是可用性组的名称。
以下示例将 MyAg 可用性组手动故障转移到已连接的辅助副本:
ALTER AVAILABILITY GROUP MyAg FAILOVER;
使用 PowerShell
若要手动对可用性组执行故障转移:
将目录 (cd) 更改为托管目标次要副本的服务器实例。
使用 Switch-SqlAvailabilityGroup cmdlet 命令。
注意
若要查看 cmdlet 的语法,请在 PowerShell 环境中使用 Get-Help SQL Server cmdlet。 有关详细信息,请参阅获取有关 SQL Server PowerShell 的帮助。
下面的示例将 MyAg 可用性组手动故障转移到具有指定路径的次要副本:
Switch-SqlAvailabilityGroup -Path SQLSERVER:\Sql\SecondaryServer\InstanceName\AvailabilityGroups\MyAg配置和使用 SQL Server PowerShell 提供程序:
后续步骤:在手动故障转移可用性组之后
如果您在可用性组的自动故障转移集之外执行了故障转移,请调整 Windows Server 故障转移群集节点的仲裁投票配置,使其与新的可用性组配置保持一致。 有关详细信息,请参阅 Windows Server 故障转移群集 (WSFC) 与 SQL Server。
对读取扩展可用性组中的主副本进行故障转移
每个可用性组仅有一个主要副本。 主要副本允许读取和写入操作。 若要更改哪个副本为主要副本,可进行故障转移。 在典型的可用性组中,群集管理器自动执行故障转移过程。 在群集类型为 NONE 的可用性组中,故障转移过程是手动进行的。
在群集类型为 NONE 的可用性组中,有两种对主要副本进行故障转移的方法:
- 手动故障转移(无数据丢失)
- 强制手动故障转移(会丢失数据)
手动故障转移(无数据丢失)
主要副本可用时使用此方法,但你需要暂时或永久更改托管主要副本的实例。 为避免潜在的数据丢失,请在执行手动故障转移之前,确保目标辅助副本处于最新状态。
手动故障转移(无数据丢失):
将当前的主要副本和目标次要副本设置为
SYNCHRONOUS_COMMIT。ALTER AVAILABILITY GROUP [AGRScale] MODIFY REPLICA ON N'<node2>' WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);若要确认活动事务已提交到主副本和至少一个同步次要副本,请运行以下查询:
SELECT ag.name, drs.database_id, drs.group_id, drs.replica_id, drs.synchronization_state_desc, ag.sequence_number FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups ag WHERE drs.group_id = ag.group_id;当
synchronization_state_desc为SYNCHRONIZED时,会同步次要副本。将
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT更新为 1。以下脚本在名为
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT的可用性组上将ag1设置为 1。 运行以下脚本前,将ag1替换为可用性组的名称:ALTER AVAILABILITY GROUP [AGRScale] SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);此设置可确保将每个活动事务提交到主要副本和至少一个同步次要副本。
注意
此设置并非专用于故障转移,应根据环境的要求进行设置。
将主要副本和不参与故障转移的次要副本设为脱机,为角色更改做好准备:
ALTER AVAILABILITY GROUP [AGRScale] OFFLINE将目标次要副本升级为主要副本。
ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS;将旧的主要和其他次要副本的角色更新为
SECONDARY,在托管旧的主要副本的 SQL Server 实例上运行以下命令:ALTER AVAILABILITY GROUP [AGRScale] SET (ROLE = SECONDARY);注意
若要删除可用性组,请使用 DROP AVAILABILITY GROUP。 对于使用群集类型为 NONE 或 EXTERNAL 创建的可用性组,请对可用性组的所有副本执行该命令。
恢复数据移动,在托管主副本的 SQL Server 实例上,对可用性组中的每个数据库运行以下命令:
ALTER DATABASE [db1] SET HADR RESUME重新创建出于读取缩放目的创建且不受群集管理器管理的所有侦听器。 如果原侦听器指向旧主副本,请将其删除,然后重新创建一个指向新主副本的侦听器。
强制手动故障转移(会丢失数据)
如果主要副本不可用且无法立即恢复,则需要强制执行向次要副本的故障转移(存在数据丢失)。 但是,如果原始主要副本在故障转移后恢复,它将承担主要角色。 若要避免各个副本处于不同状态,请在发生数据丢失的强制故障转移后,将原主副本从可用性组中删除。 原始主副本重新联机后,将可用性组从该副本中完全删除。
若要强制执行从主要副本 N1 到次要副本 N2 的手动故障转移(存在数据丢失),请执行以下步骤:
在次要副本 (N2) 上,启动强制故障转移:
ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;在新的主要副本 (N2) 上,删除原始主要副本 (N1):
ALTER AVAILABILITY GROUP [AGRScale] REMOVE REPLICA ON N'N1';确认所有应用程序流量均路由到侦听器和/或新的主副本。
如果原始主节点 (N1) 联机,请立即在原始主节点 (N1) 上将可用性组 AGRScale 置于脱机状态:
ALTER AVAILABILITY GROUP [AGRScale] OFFLINE如果存在数据或未同步的更改,则通过备份或其他可满足业务需求的数据复制选项来保存这些数据。
接下来,从原始主副本 (N1) 中删除可用性组:
DROP AVAILABILITY GROUP [AGRScale];删除原来的主副本 (N1) 上的可用性组数据库:
USE [master] GO DROP DATABASE [AGDBRScale] GO(可选)如果需要,现可将 N1 作为新的次要副本添加回可用性组 AGRScale 中。