执行 Always On 可用性组的计划手动故障转移 (SQL Server)

适用于:SQL Server

本主题说明如何在 SQL Server 中使用 SQL Server Management Studio、Transact-SQL 或 PowerShell 对 Always On 可用性组执行手动故障转移而不丢失数据(计划的手动故障转移)。 可用性组在可用性副本级别进行故障转移。 计划的手动故障转移类似于所有 Always On 可用性组的故障转移,将次要副本转换为主要角色。 故障转移同时会将先前的主要副本转换为次要角色。

仅当主要副本和目标次要副本在同步提交模式下运行且当前同步时,才支持计划的手动故障转移。 计划的手动故障转移暂留辅助数据库中的所有数据,这些数据库加入目标次要副本上的可用性组。 将以前的主要副本转换为次要角色后,其数据库将成为辅助数据库。 然后它们开始与新的主数据库同步。 在将其全部转换为 SYNCHRONIZED 状态之后,新的辅助副本将变成适于充当将来计划的手动故障转移的目标。

注意

如果次要副本和主要副本都配置为自动故障转移模式,那么同步次要副本后,该副本还可以用作自动故障转移的目标。 有关详细信息,请参阅可用性模式(Always On 可用性组)

在开始之前

重要

在没有群集管理器的情况下,需要通过一些特定过程对读取缩放可用性组进行故障转移。 当可用性组具有 CLUSTER_TYPE = NONE 时,请按照故障转移读取缩放可用性组上的主要副本中的过程进行操作。

限制和局限

先决条件和限制

  • 目标次要副本和主要副本必须同时在同步提交可用性模式下运行。

  • 目标次要副本当前必须与主要副本同步。 此次要副本上的所有辅助数据库都必须已联接到可用性组。 它们还必须与自己对应的主数据库同步(即本地辅助数据库必须为 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

对可用性组执行手动故障转移:

  1. 在对象资源管理器中,连接到托管需要进行故障转移的可用性组的一个次要副本的服务器实例。 展开服务器树。

  2. 依次展开“Always On 高可用性”节点和“可用性组”节点。

  3. 右键单击要进行故障转移的可用性组,然后选择“故障转移”

  4. “故障转移可用性组向导”随即启动。 有关详细信息,请参阅使用故障转移可用性组向导 (SQL Server Management Studio)

使用 Transact-SQL

对可用性组执行手动故障转移:

  1. 连接到承载目标辅助副本的服务器实例。

  2. 按如下所示使用 ALTER AVAILABILITY GROUP 语句:

    ALTER AVAILABILITY GROUP group_name FAILOVER

    在该语句中,group_name 是可用性组的名称。

    以下示例将 MyAg 可用性组手动故障转移到连接的次要副本:

    ALTER AVAILABILITY GROUP MyAg FAILOVER;  
    

使用 PowerShell

对可用性组执行手动故障转移:

  1. 将目录 (cd) 更改为托管目标次要副本的服务器实例。

  2. 使用 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 的可用性组中,有两种对主要副本进行故障转移的方法:

  • 手动故障转移(无数据丢失)
  • 强制手动故障转移(会丢失数据)

手动故障转移(无数据丢失)

主要副本可用时使用此方法,但你需要暂时或永久更改托管主要副本的实例。 若要避免潜在的数据丢失,发出手动故障转移前,确保目标次要副本为最新版本。

手动故障转移(无数据丢失):

  1. 将当前的主要副本和目标次要副本设置为 SYNCHRONOUS_COMMIT

    ALTER AVAILABILITY GROUP [AGRScale] 
         MODIFY REPLICA ON N'<node2>' 
         WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
    
  2. 若要确定已将活动事务提交到主要副本和至少一个同步次要副本,请运行以下查询:

    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_descSYNCHRONIZED 时,会同步次要副本。

  3. REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 更新为 1。

    以下脚本在名为 ag1 的可用性组上将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 设置为 1。 运行以下脚本前,将 ag1 替换为可用性组的名称:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    此设置可确保将每个活动事务提交到主要副本和至少一个同步次要副本。

    注意

    此设置并非特定于故障转移,应根据环境要求进行设置。

  4. 将主要副本和不参与故障转移的次要副本设置为脱机,以便为角色更改做好准备:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 将目标次要副本升级为主要副本。

    ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 将旧的主要和其他次要副本的角色更新为 SECONDARY,在托管旧的主要副本的 SQL Server 实例上运行以下命令:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (ROLE = SECONDARY); 
    

    注意

    若要删除可用性组,请使用删除可用性组。 对于使用群集类型为 NONE 或 EXTERNAL 创建的可用性组,请对可用性组的所有副本执行该命令。

  7. 恢复数据移动,为托管主要副本的 SQL Server 实例上的可用性组中的每个数据库运行以下命令:

    ALTER DATABASE [db1]
         SET HADR RESUME
    
  8. 重新创建出于读取缩放目的创建且不受群集管理器管理的所有侦听器。 如果原始侦听器指向旧的主要副本,请将其删除,然后将其重新创建为指向新的主要副本。

强制手动故障转移(会丢失数据)

如果主要副本不可用且无法立即恢复,则需要强制执行向次要副本的故障转移(存在数据丢失)。 但是,如果原始主要副本在故障转移后恢复,它将承担主要角色。 若要避免每个副本处于不同的状态,在存在数据丢失的情况下进行强制故障转移后,从可用性组中删除原始主要副本。 原始主要副本重新联机后,从该副本完全删除该可用性组。

若要强制执行从主要副本 N1 到次要副本 N2 的手动故障转移(存在数据丢失),请执行以下步骤:

  1. 在次要副本 (N2) 上,启动强制故障转移:

    ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    
  2. 在新的主要副本 (N2) 上,删除原始主要副本 (N1):

    ALTER AVAILABILITY GROUP [AGRScale]
    REMOVE REPLICA ON N'N1';
    
  3. 验证所有的应用程序流量均指向侦听器和/或新的主要副本。

  4. 如果原始主要副本 (N1) 进入联机状态,则立即在原始主要副本 (N1) 上使可用性组 AGRScale 脱机:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 如果存在数据或未同步的更改,则通过备份或其他可满足业务需求的数据复制选项来保存这些数据。

  6. 接下来,从原始主要副本 (N1) 中删除可用性组:

    DROP AVAILABILITY GROUP [AGRScale];
    
  7. 删除原始主要副本 (N1) 上的可用性组数据库:

    USE [master]
    GO
    DROP DATABASE [AGDBRScale]
    GO
    
  8. (可选)如果需要,现可将 N1 作为新的次要副本添加回可用性组 AGRScale 中。

另请参阅