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

适用于SQL Server

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

支持的操作

SQL Server 复制支持自动对发布服务器和事务订阅服务器进行故障转移。 合并订阅服务器可以属于可用性组,但必须在故障转移后通过手动操作来配置新订阅服务器。 可用性组无法与 Websync 和 SQL Server Compact 方案结合使用。

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

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

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

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

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

    注意

    订阅必须通过使用 Transact-SQL 脚本创建,不能使用 Management Studio创建。

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

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

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

如果在每次故障转移后使用可用性组中的订阅数据库来创建请求订阅,建议在旧的主要副本上禁用分发代理作业,并在新的主要副本上启用此作业。

创建事务复制推送订阅

-- 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>',
    @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

注意

为属于可用性组的订阅服务器运行 sp_addpullsubscription_agent 时,必须将 @Subscriber 参数值作为可用性组侦听器名称传递到存储过程。 如果运行的是 SQL Server 2016 (13.x) 和更早版本,或 CU16 之前的 SQL Server 2017 (14.x),存储过程将不会引用可用性组侦听器名称;它将使用执行命令的订阅服务器名称来创建。 若要解决此问题,请使用可用性组侦听器名称值手动更新分发代理作业上的 @Subscriber 参数。

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

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

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

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

注意

当前进程对于合并复制订阅服务器并不方便,但是合并复制的主要应用场景是断开连接的用户(台式机、笔记本电脑、手机设备),它们不使用订阅服务器上的可用性组。

请参阅