故障转移链接 - Azure SQL 托管实例

适用于:Azure SQL 托管实例

本文介绍如何使用 SQL Server Management Studio (SSMS) 或 PowerShell 来故障转移 SQL Server 和 Azure SQL 托管实例之间链接的数据库,以进行灾难恢复或迁移。

先决条件

若要通过链接将数据库故障转移到次要副本,需要满足以下先决条件:

停止工作负载

若要将数据库故障转移到次要副本,请先在维护时段停止主要副本上的任何应用程序工作负载。 这使数据库复制能够赶上次要副本,让你能在不丢失数据的情况下故障转移到次要副本。 在进行故障转移之前,请确保应用程序不会向主要副本提交事务。

故障转移数据库

可以使用 Transact-SQL (T-SQL)、SQL Server Management Studio 或 PowerShell 来故障转移链接的数据库。

SQL Server 2022 CU13 (KB5036432) 开始,可以通过使用 Transact-SQL 对链接进行故障转移。

若要对链接执行计划的故障转移,请在主要副本上使用以下 T-SQL 命令:

ALTER AVAILABILITY GROUP [<DAGname>] FAILOVER

若要执行强制故障转移,请在次要副本上使用以下 T-SQL 命令:

ALTER AVAILABILITY GROUP [<DAGname>] FORCE_FAILOVER_ALLOW_DATA_LOSS

故障转移后查看数据库

对于 SQL Server 2022,如果选择维持链接,则可以检查分布式可用性组是否存在于 SQL Server Management Studio 中对象资源管理器可用性组下。

如果在故障转移期间删除了链接,则可以使用对象资源管理器来确认分布式可用性组不再存在。 如果选择保留可用性组,则数据库仍将同步

故障转移后清理

除非选择了“故障转移成功后删除链接”,否则使用 SQL Server 2022 进行故障转移不会中断链接。 可以在故障转移后维持链接,这会使可用性组和分布式可用性组保持活动状态。 无需执行其他操作。

删除链接只会删除分布式可用性组,并使可用性组保持活动状态。 可以决定保留可用性组,或将其删除。

如果决定删除可用性组,请替换以下值,然后运行示例 T-SQL 代码:

  • <AGName> 替换为 SQL Server 上可用性组的名称(用于创建链接)。
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <AGName> 
GO

强制故障转移后的状态不一致

强制故障转移后,可能会遇到裂脑情况,其中两个副本都处于主角色,导致链接处于不一致状态。 如果在灾难期间故障转移到次要副本,然后主要副本重新联机,则可能会发生这种情况。

首先,确认你处于裂脑应用场景中。 可以使用 SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL) 来执行此操作。

在 SSMS 中连接到 SQL Server 和 SQL 托管实例,然后在对象资源管理器中,展开“Always On 高可用性”中“可用性组”节点下的“可用性副本”。 如果两个不同的副本列为“(主要)”,则表明你处于裂脑应用场景中。

或者,可以在 SQL Server SQL 托管实例上运行以下 T-SQL 脚本来检查副本的角色:

-- Execute on SQL Server and SQL Managed Instance 

declare @link_name varchar(max) = '<DAGName>' 
USE MASTER 
GO

SELECT
   ag.name [Link name], 
   rs.role_desc [Link role] 
FROM
   sys.availability_groups ag 
   join sys.dm_hadr_availability_replica_states rs 
   on ag.group_id = rs.group_id 
WHERE 
   rs.is_local = 1 and ag.name = @link_name 
GO

如果两个实例在“链接角色”列中列出不同的主要副本,则表示你处于裂脑应用场景中。

若要解决裂脑状态,请先对原始主副本执行备份。 如果原始主副本是 SQL Server,则执行结尾日志备份。 如果原始主副本是 SQL 托管实例,则执行仅复制完整备份。 备份完成后,将分布式可用性组设置为副本的辅助角色,该副本曾经是原始主要副本,但现在将成为新的次要副本。

例如,如果发生真正的灾难,假设已强制将 SQL Server 工作负载故障转移到 Azure SQL 托管实例,并且打算继续在 SQL 托管实例 上运行工作负载,请在 SQL Server 上执行结尾日志备份,然后将分布式可用性组设置为 SQL Server 上的辅助角色,如以下示例所示:

--Execute on SQL Server 
USE MASTER

ALTER availability group [<DAGName>] 
SET (role = secondary) 
GO 

接下来,使用链接执行从 SQL 托管实例到 SQL Server 的计划内手动故障转移,如以下示例所示:

--Execute on SQL Managed Instance 
USE MASTER

ALTER availability group [<DAGName>] FAILOVER 
GO 

要使用该链接,请参阅以下内容:

要了解有关该链接的详细信息,请参阅以下内容:

对于其他复制和迁移方案,请考虑: