使用分布式 AG 迁移可用性组

使用分布式可用性组 (AG) 迁移 Always On 可用性组中的数据库,同时在 Azure 虚拟机 (VM) 上的 SQL Server 上保持高可用性和灾难恢复 (HADR) 支持。

验证源 SQL Server 实例满足先决条件后,请按照本文中的步骤在现有可用性组和 Azure VM 上的 SQL Server 上的目标可用性组之间创建分布式可用性。

本文适用于参与可用性组的数据库,并且需要 Windows Server 故障转移群集 (WSFC) 和可用性组侦听器。 也可以从独立的 SQL Server 实例迁移数据库

使用分布式可用性组解释可用性组迁移的示意图。

初始设置

第一步是在 Azure 中创建 SQL Server VM。 可以使用 Azure 门户Azure PowerShellARM 模板来执行此操作。

请务必根据先决条件配置 SQL Server VM。 选择是单子网部署还是多子网部署,前者依赖 Azure 负载均衡器或分布式网络名称将流量路由到可用性组侦听程序,后者则没有此类要求。 建议使用多子网部署。 若要了解详细信息,请查看连接

为简单起见,请将目标 SQL Server VM 加入到与源 SQL Server 实例相同的域中。 否则,请将目标 SQL Server VM 加入与源 SQL Server 实例的域联合的域。

要使用自动种子设定来创建分布式可用性组 (DAG),DAG 的全局主实例(源)的实例名称必须与 DAG 转发器(目标)的实例名称匹配。 如果全局主实例和转发器之间的实例名称不匹配,则必须使用手动种子设定来创建 DAG,并在以后手动添加任何其他数据库文件。

本文使用以下示例参数:

  • 数据库名称:Adventureworks2022
  • 源计算机名称:OnPremNode1(DAG 中的全局主节点),OnPremNode2
  • 源 SQL Server 实例名称:MSSQLSERVERMSSQLSERVER
  • 源可用性组名称:OnPremAg
  • 源可用性组侦听程序名称:OnPremAG_LST
  • 目标 SQL Server VM 名称:SQLVM1(DAG 中的转发器),SQLVM2
  • Azure VM 实例名称上的目标 SQL Server:MSSQLSERVERMSSQLSERVER
  • 目标可用性组名称:AzureAG
  • 源可用性组侦听程序名称:AzureAG_LST
  • 终结点名称:Hadr_endpoint
  • 分布式可用性组名称:DAG
  • 域名:Contoso

创建终结点

使用 Transact-SQL (T-SQL) 在两个源实例(OnPremNode1OnPremNode2)和目标 SQL Server 实例(SQLVM1SQLVM2)上创建终结点。

如果已在源实例上配置了可用性组,则只能在两个目标实例上运行此脚本。

要创建终结点,请在源服务器和目标服务器上运行此 T-SQL 脚本:

CREATE ENDPOINT [Hadr_endpoint] STATE = STARTED AS TCP (
    LISTENER_PORT = 5022,
    LISTENER_IP = ALL
)
FOR DATA_MIRRORING(ROLE = ALL,
    AUTHENTICATION = WINDOWS NEGOTIATE,
    ENCRYPTION = REQUIRED ALGORITHM AES);
GO

域帐户自动有权访问终结点,但服务帐户可能不会自动成为 sysadmin 组的一部分,并且可能没有连接权限。 要手动授予 SQL Server 服务帐户对终结点的连接权限,请在两台服务器上运行以下 T-SQL 脚本:

GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [<your account>];

创建源 AG

由于分布式可用性组是跨两个单独可用性组的特殊可用性组,因此您首先需要在两个源 SQL Server 实例上创建一个可用性组。

如果源实例上已有可用性组,请跳过此部分。

使用 Transact-SQL (T-SQL) 在示例数据库 OnPremAG 的两个源实例(OnPremNode1OnPremNode2)之间创建可用性组 (Adventureworks2022)。

要在源实例上创建可用性组,请在源主副本 (OnPremNode1) 上运行此脚本:

CREATE AVAILABILITY GROUP [OnPremAG]
WITH (
    AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
    DB_FAILOVER = OFF,
    DTC_SUPPORT = NONE
)
FOR DATABASE [Adventureworks2022] REPLICA
ON N'OnPremNode1' WITH (
    ENDPOINT_URL = N'TCP://OnPremNode1.contoso.com:5022',
    FAILOVER_MODE = AUTOMATIC,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    SEEDING_MODE = AUTOMATIC,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
),
N'OnPremNode2' WITH (
    ENDPOINT_URL = N'TCP://OnPremNode2.contoso.com:5022',
    FAILOVER_MODE = AUTOMATIC,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    SEEDING_MODE = AUTOMATIC,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
);

下一步,将辅助副本 (OnPremNode2) 联接到该可用性组 (OnPremAg)。

要加入可用性组,请在源次要副本上运行此脚本:

ALTER AVAILABILITY GROUP [OnPremAG] JOIN;
GO
ALTER AVAILABILITY GROUP [OnPremAG] GRANT CREATE ANY DATABASE;
GO

最后,为全局转发器可用性组 (OnPremAG) 创建侦听器。

要创建侦听器,请在源主副本上运行此脚本:

USE [master]
GO

ALTER AVAILABILITY GROUP [OnPremAG]
ADD LISTENER N'OnPremAG_LST' (
    WITH IP (
        (<available_static_ip>, <mask>),
        PORT = 60173
    )
);
GO

创建目标 AG

还需要在目标 SQL Server VM 上创建可用性组。

如果已经在 Azure 中的 SQL Server 实例之间配置了可用性组,请跳过此部分。

使用 Transact-SQL (T-SQL) 在目标 SQL Server 实例(AzureAGSQLVM1)上创建可用性组 (SQLVM2)。

要在目标上创建可用性组,请在目标主副本上运行此脚本:

CREATE AVAILABILITY GROUP [AzureAG] FOR REPLICA
ON N'SQLVM1' WITH (
    ENDPOINT_URL = N'TCP://SQLVM1.contoso.com:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
    SEEDING_MODE = AUTOMATIC
),
N'SQLVM2' WITH (
    ENDPOINT_URL = N'TCP://SQLVM2.contoso.com:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
    SEEDING_MODE = AUTOMATIC
);
GO

接下来,将目标辅助副本 (SQLVM2) 加入可用性组 (AzureAG)。

在目标辅助副本上运行此脚本:

ALTER AVAILABILITY GROUP [AzureAG] JOIN;
GO
ALTER AVAILABILITY GROUP [AzureAG] GRANT CREATE ANY DATABASE;
GO

最后,为目标可用性组 (AzureAG_LST) 创建一个侦听器 (AzureAG)。 如果将 SQL Server VM 部署到多个子网,请使用 Transact-SQL 创建侦听器。 如果将 SQL Server VM 部署到单个子网,请为侦听器配置 Azure 负载均衡器分布式网络名称

若要创建侦听器,请在 Azure 中可用性组的主副本上运行此脚本。

ALTER AVAILABILITY GROUP [AzureAG]
ADD LISTENER N'AzureAG_LST' (
    WITH IP (
        (N'<primary replica_secondary_ip>', N'<primary_mask>'),
        (N'<secondary replica_secondary_ip>', N'<secondary_mask>')
    ),
    PORT = <port_number_you_set>
);
GO

创建分布式 AG

配置了源 (OnPremAG) 和目标 (AzureAG) 可用性组后,创建分布式可用性组以跨越两个单独的可用性组。

在源 SQL Server 全局主节点 (OnPremNode1) 和 AG (OnPremAG) 上使用 Transact-SQL 创建分布式可用性组 (DAG)。

要在源上创建分布式 AG,请在源全局主节点上运行此脚本:

CREATE AVAILABILITY GROUP [DAG]
WITH (DISTRIBUTED) AVAILABILITY GROUP
ON 'OnPremAG' WITH (
    LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SEEDING_MODE = AUTOMATIC
),
'AzureAG' WITH (
    LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SEEDING_MODE = AUTOMATIC
);
GO

注意

种子设定模式设置为 AUTOMATIC,因为目标和源上的 SQL Server 版本相同。 如果你的 SQL Server 目标是更高版本,或者如果你的全局主服务器和转发器具有不同的实例名称,则创建分布式 AG,将辅助 AG 加入分布式 AG,并将 SEEDING_MODE 设置为 MANUAL。 然后手动将数据库从源恢复到目标 SQL Server 实例。 查看迁移期间升级版本以了解更多信息。

创建分布式 AG 后,将目标转发器实例 (AzureAG) 上的目标 AG (SQLVM1) 加入分布式 AG (DAG)。

要将目标 AG 加入分布式 AG,请在目标转发器上运行此脚本:

ALTER AVAILABILITY GROUP [DAG]
INNER JOIN AVAILABILITY GROUP
ON 'OnPremAG' WITH (
        LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        FAILOVER_MODE = MANUAL,
        SEEDING_MODE = AUTOMATIC
        ),
'AzureAG' WITH (
    LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SEEDING_MODE = AUTOMATIC
);
GO

如果需要取消、暂停或延迟源和目标可用性组之间的同步(例如,性能问题),则请在源全局主实例 (OnPremNode1) 上运行此脚本:

ALTER AVAILABILITY GROUP [DAG]
MODIFY AVAILABILITY GROUP ON 'AzureAG'
WITH (SEEDING_MODE = MANUAL);

要了解详细信息,请参阅取消转发器的自动种子设定