复制订阅服务器和 Always On 可用性组 (SQL Server)

适用于SQL Server

当包含作为复制订阅服务器的数据库的 Always On 可用性组 (AG) 发生故障转移时,复制订阅可能会失败。 对于事务复制推送订阅服务器,如果订阅是使用 AG 侦听器名称创建的,则在故障转移后,分发代理会自动继续复制。 对于事务复制拉取订阅服务器,如果订阅是使用 AG 侦听器名称创建的,且原始订阅服务器已启动并正在运行,则在故障转移后,分发代理会自动继续复制。 这是因为仅在原始订阅服务器(AG 的主要副本)上创建分发代理作业。 对于合并订阅服务器,复制管理员必须通过重新创建订阅手动重新配置订阅服务器。

支持的操作

SQL Server 复制支持自动对发布服务器和事务订阅服务器进行故障转移。 合并订阅者可以是 AG 的一部分。 但是,故障转移后需要手动操作才能配置新的订阅者。 可用性组无法与 Websync 和 SQL Server Compact 方案结合使用。

在可用性组中创建事务订阅

对于事务复制,请执行以下步骤以配置订阅服务器可用性组并对其进行故障转移:

  1. 在创建订阅之前,请将订阅服务器数据库添加到相应的可用性组。

  2. 将订阅服务器的可用性组侦听器作为链接服务器添加到可用性组的所有节点。 此步骤可确保所有潜在故障转移伙伴能够知道并连接到侦听器。

  3. 使用创建事务复制推送订阅部分中的脚本,并使用订阅服务器的可用性组侦听器的名称创建订阅。 故障转移后,侦听器名称始终有效,而订阅者的实际服务器名称则取决于实际成为新主节点的节点。

    注意

    必须使用 Transact-SQL 脚本来创建订阅。 无法使用 Management Studio。

  4. 若要创建请求订阅,请执行以下操作:

    1. 使用创建事务复制请求订阅部分中的示例脚本,并使用订阅服务器的可用性组侦听器的名称创建订阅。

    2. 故障转移后,使用 sp_addpullsubscription_agent 存储过程,在新的主要副本上创建分发代理作业。

使用 AG 中的订阅数据库创建请求订阅时,每次故障转移后,都应在旧的主副本上禁用分发代理作业,并在新的主副本上启用该作业。

创建事务复制推送订阅

-- commands to execute at the publisher, in the publisher database:
USE [<publisher database name>];
GO

EXEC sp_addsubscription @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @destination_db = N'<subscriber database name>',
    @subscription_type = N'Push',
    @sync_type = N'automatic',
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0;
GO

EXEC sp_addpushsubscription_agent @publication = N'<publication name>',
    @subscriber = N'<AG listener name>',
    @subscriber_db = N'<subscriber database name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

创建事务复制请求订阅

-- commands to execute at the subscriber, in the subscriber database:
USE [<subscriber database name>];
GO

EXEC sp_addpullsubscription @publisher = N'<publisher name>',
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @subscription_type = N'pull';
GO

EXEC sp_addpullsubscription_agent @publisher = N'<publisher name>',
    @subscriber = N'<AG listener name or alias>',
    @distributor = N'<distributor AG listener name>', -- this parameter should only be used if the distribution database is part of an AG.
    @publisher_db = N'<publisher database name>',
    @publication = N'<publication name>',
    @job_login = NULL,
    @job_password = NULL,
    @subscriber_security_mode = 1;
GO

可用性组侦听器要求

为属于 AG 的订阅服务器运行 sp_addpullsubscription_agent 时,必须将 @subscriber 参数的值作为 AG 监听器名称传递给存储过程。 如果在 CU 16 之前运行 SQL Server 2016(13.x)和早期版本或 SQL Server 2017 (14.x),则存储过程不会引用 AG 侦听器名称。 它使用执行命令的订阅服务器名称创建订阅。 若要解决此问题,请使用 AG 侦听器名称值手动更新@subscriber复制分发代理上的参数。

如果订阅者 AG 侦听器使用非默认端口,则在 Windows 上不支持在 @subscriber 参数中将端口号作为 AG 侦听器名称的一部分提供。 解决方法是,可以使用 别名 (SQL Server Configuration Manager)SQL Server 客户端网络实用工具 (cliconfg) 为 SQL Server 2022 (16.x) 及更高版本的侦听器和端口创建别名,并将该别名作为 @subscriber 参数值传递。

在订阅服务器可用性组发生故障转移后恢复合并代理

进行合并复制时,复制管理员必须手动重新配置订阅服务器,步骤如下:

  1. 执行 sp_subscription_cleanup 删除订阅服务器的旧订阅。 在新的主副本(以前为辅助副本)上执行此操作。

  2. 通过从新快照开始创建新订阅来重新创建订阅。

注意

对于合并复制订阅者,这一过程不太方便。 但是,合并复制的主要方案是断开连接的用户(台式机、笔记本电脑、手机设备),这些用户不使用订阅服务器上的 AG。