使用 AlwaysOn 可用性组配置复制

适用于:SQL Server - 仅限 Windows

配置 SQL Server 复制和 AlwaysOn 可用性组涉及七个步骤。 在下面的各节中将详细说明每个步骤。

1. 配置数据库发布和订阅

配置分发器

分发数据库不能放置在具有 SQL Server 2012 和 SQL Server 2014 的可用性组中。 SQL 2016 及更高版本支持将分发数据库放置在可用性组中,但用于合并、双向或对等复制拓扑的分发数据库除外。 有关详细信息,请参阅 在 AlwaysOn 可用性组中设置复制分发数据库。

  1. 在分发服务器上配置分发。 如果正在使用存储过程进行配置,请运行 sp_adddistributor。使用 @password 参数来标识在远程发布服务器连接到分发服务器时将使用的密码。 在设置远程分发服务器时,每台远程发布服务器上也将需要密码。

    USE master;
    GO
    
    EXECUTE sys.sp_adddistributor
        @distributor = 'MyDistributor',
        @password = '**Strong password for distributor**';
    
  2. 在分发服务器上创建分发数据库。 如果正在使用存储过程进行配置,请运行 sp_adddistributiondb

    USE master;
    GO
    
    EXECUTE sys.sp_adddistributiondb
        @database = 'distribution',
        @security_mode = 1;
    
  3. 配置远程发布服务器。 如果使用存储过程来配置分发服务器,请运行 sp_adddistpublisher。@security_mode 参数用于确定如何将从复制代理运行的发布服务器验证存储过程连接到当前主要副本。 如果设置为 1,则使用 Windows 身份验证来连接到当前主副本。 如果设置为 0,则将 SQL Server 身份验证与指定的 @login 和 @password 值一起使用。 指定的登录名和密码必须在每个辅助副本上均有效才能让验证存储过程成功地连接到相应的副本。

    注意

    如果任何已修改的复制代理在分发服务器之外的计算机上运行,则使用 Windows 身份验证连接到主副本的方法将要求为副本主机之间的通信配置 Kerberos 身份验证。 使用 SQL Server 登录名连接到当前主副本的方法无需 Kerberos 身份验证。

    USE master;
    GO
    
    EXECUTE sys.sp_adddistpublisher
        @publisher = 'AGPrimaryReplicaHost',
        @distribution_db = 'distribution',
        @working_directory = '\\MyReplShare\WorkingDir',
        @login = 'MyPubLogin',
        @password = '**Strong password for publisher**';
    

有关详细信息,请参阅 sp_adddistpublisher

在原始发布服务器上配置发布服务器

  1. 配置远程分发。 如果使用存储过程来配置发布服务器,请运行 sp_adddistributor。为 @password 指定与在分发服务器上运行 sp_adddistrbutor 以设置分发时使用的值相同的值

    EXECUTE sys.sp_adddistributor
        @distributor = 'MyDistributor',
        @password = 'MyDistPass';
    
  2. 启用数据库复制。 如果使用存储过程配置发布服务器,请运行 sp_replicationdboption。如果要为数据库同时配置事务复制和合并复制,则必须分别启用它们。

    USE master;
    GO
    
    EXECUTE sys.sp_replicationdboption
        @dbname = 'MyDBName',
        @optname = 'publish',
        @value = 'true';
    
    EXECUTE sys.sp_replicationdboption
        @dbname = 'MyDBName',
        @optname = 'merge publish',
        @value = 'true';
    
  3. 创建复制发布、文章和订阅。 有关如何配置复制的详细信息,请参阅“发布数据和数据库对象”。

2.配置可用性组

在目标主副本上,创建包含已发布的(或即将要发布的)数据库作为成员数据库的可用性组。 如果使用可用性组向导,则您可允许该向导最初同步辅助副本数据库,或者您可以使用备份和还原手动执行初始化。

为可用性组创建一个 DNS 侦听器,复制代理将使用它连接到当前主副本。 指定的侦听器名称将用作原始发布服务器/已发布数据库对的重定向的目标。 例如,如果使用 DDL 配置可用性组,则可以使用以下代码示例为名为 MyAG的现有可用性组指定可用性组侦听器:

ALTER AVAILABILITY GROUP 'MyAG'
    ADD LISTENER 'MyAGListenerName' (WITH IP (('10.120.19.155', '255.255.254.0')));

有关详细信息,请参阅创建和配置可用性组 (SQL Server)

3. 确保所有辅助副本主机都配置为进行复制

在每个辅助副本主机上,确保已将 SQL Server 配置为支持复制。 可在每个辅助副本主机上运行以下查询来确定是否安装了复制功能:

USE master;
GO

DECLARE @installed AS INT;

EXECUTE @installed = sys.sp_MS_replication_installed;

SELECT @installed;

如果 @installed 设置为 0,则必须将复制功能添加到 SQL Server 安装中。

4. 将辅助副本主机配置为复制发布服务器

辅助副本不能充当复制发布服务器或重新发布服务器,但必须配置复制以便在故障转移之后辅助副本可以接管。 在分发服务器上,为每个辅助副本主机配置分发。 指定在向分发服务器添加原始发布服务器时所指定的相同的分发数据库和工作目录。 如果使用存储过程配置分发,请使用 sp_adddistpublisher 将远程发布者与分发服务器相关联。 如果对原始发布服务器使用了 @login@password ,则在您添加辅助副本主机作为发布服务器时为每个辅助副本主机指定相同的值。

EXECUTE sys.sp_adddistpublisher
    @publisher = 'AGSecondaryReplicaHost',
    @distribution_db = 'distribution',
    @working_directory = '\\MyReplShare\WorkingDir',
    @login = 'MyPubLogin',
    @password = '**Strong password for publisher**';

在每个辅助副本主机上配置分发。 将原始发布服务器的分发服务器标识为远程分发服务器。 使用最初在分发服务器上运行 sp_adddistributor 时所使用的相同密码。 如果存储过程用于配置分发,则 sp_adddistributor@password 参数用于指定密码。

EXECUTE sp_adddistributor
    @distributor = 'MyDistributor',
    @password = '**Strong password for distributor**';

在每个辅助副本主机上,确保数据库发布的推送订阅服务器显示为链接服务器。 如果要使用存储过程来配置远程发布服务器,则使用 sp_addlinkedserver 将订阅服务器(如果尚未存在)作为链接服务器添加到发布服务器。

EXECUTE sys.sp_addlinkedserver @server = 'MySubscriber';

5. 将原始发布服务器重定向到 AG 侦听器名称

在分发服务器上的分发数据库中,运行存储过程 sp_redirect_publisher 以将原始发布服务器和已发布的数据库与可用性组的可用性组侦听器名称相关联。

USE distribution;
GO

EXECUTE sys.sp_redirect_publisher
    @original_publisher = 'MyPublisher',
    @publisher_db = 'MyPublishedDB',
    @redirected_publisher = 'MyAGListenerName';

6.运行复制验证存储过程以验证配置

在分发服务器上,在分发数据库中,运行存储过程 sp_validate_replica_hosts_as_publishers,以验证所有副本主机现在是否配置为作为已发布数据库的发布服务器。

USE distribution;
GO

DECLARE @redirected_publisher AS sysname;

EXECUTE sys.sp_validate_replica_hosts_as_publishers
    @original_publisher = 'MyPublisher',
    @publisher_db = 'MyPublishedDB',
    @redirected_publisher = @redirected_publisher OUTPUT;

应在每个可用性组副本主机上使用具有足够授权的登录名来运行存储过程 sp_validate_replica_hosts_as_publishers,以查询有关可用性组的信息。 与 sp_validate_redirected_publisher 不同,它将使用调用方的凭据,且不会使用保留在 msdb.dbo.MSdistpublishers 中的登录名来连接到可用性组副本。

验证辅助副本主机时出错

在验证不允许读取访问或要求指定读取意图的辅助副本主机时,sp_validate_replica_hosts_as_publishers 将失败,并显示以下错误。

消息 21899,级别 11,状态 1,过程 sp_hadr_verify_subscribers_at_publisher,第 109 行

重定向的发布服务器“MyReplicaHostName”处的查询失败,该查询用于确定是否有原始发布服务器“MyOriginalPublisher”的订阅服务器的 sysserver 条目,出现错误“976”,错误消息“错误 976,级别 14,状态 1,消息:目标数据库‘MyPublishedDB’正参与某个可用性组,查询当前无法访问该数据库。 数据移动被挂起,或者未启用可用性副本,无法进行读取访问。 若要允许对该可用性组中的这一数据库和其他数据库进行只读访问,请对组中一个或多个辅助可用性副本启用只读访问权限。 有关详细信息,请参阅 SQL Server 在线丛书中的 ALTER AVAILABILITY GROUP 语句。

副本主机“MyReplicaHostName”遇到了一个或多个发布服务器验证错误。

这是预期的行为。 必须通过在主机上直接查询 sysserver 条目来验证这些次要副本主机上是否存在订阅服务器条目。

7. 将原始发布服务器添加到复制监视器

在每个可用性组副本上,向复制监视器添加原始发布服务器。

复制

创建和配置可用性组