使用 Always On 可用性组配置复制

适用于:Windows 上的 SQL Server

配置 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 参数用于指定密码。

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

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

EXECUTE sys.sp_addlinkedserver @server = 'MySubscriber';

5. 将原始发布者重定向到可用性组监听器名称

在分发服务器上,在分发数据库中,运行存储过程 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 会因以下错误而失败。

Msg 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. 将原始发布服务器添加到复制监视器

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

复制

创建和配置可用性组