复制、更改跟踪和更改数据捕获 - AlwaysOn 可用性组

适用于SQL Server

SQL ServerAlways On 可用性组上支持复制、更改数据捕获 (CDC) 和更改跟踪 (CT)。 Always On 可用性组 可帮助提供高可用性和其他数据库恢复功能。

可用性组的复制概述

发布服务器重定向

如果已发布的数据库可以识别 Always On 可用性组,则使用 redirected_publishers 条目配置向发布数据库提供代理访问的分发服务器。 这些条目利用可用性组侦听器名称连接到发布服务器和发布数据库,重定向最初配置的发布服务器/数据库对。 通过可用性组侦听器名称建立的连接在故障转移时失败。 当复制代理在故障转移后重启时,连接会自动重定向到新的主数据库。

在可用性组(AG)中,辅助数据库不能是发布服务器。 仅当事务复制与 Always On 可用性组组合在一起时,才支持重新发布。

如果已发布的数据库是可用性组的成员,并且已重定向发布服务器,则必须将该数据库重定向到与该可用性组关联的可用性组侦听器名称, 它可能不会重定向到显式节点。

注意

故障转移到辅助副本后,复制监视器无法调整 SQL Server 发布实例的名称,并继续在 SQL Server 的原始主实例的名称下显示复制信息。 故障转移后,无法使用复制监视器输入跟踪令牌,但使用 Transact-SQL 在新发布服务器上输入的跟踪令牌在复制监视器中可见。

为支持可用性组对复制代理进行的常规更改

修改了三个复制代理来支持 Always On 可用性组。 日志读取器代理、快照代理和合并代理经过了修改,现在可以查询重定向发布服务器的分发数据库,并且可以使用返回的可用性组侦听器名称来连接数据库发布服务器(如果已声明重定向的发布服务器)。

默认情况下,当代理查询分发服务器以确定原始发布服务器是否已重定向时,在将重定向主机返回到代理之前,会验证当前目标或重定向的适用性。 这是建议的行为。 但是,如果代理启动频繁发生,则与验证存储过程关联的开销可能被认为过于昂贵。 日志读取器代理、快照代理和合并代理中已新增命令行开关 BypassPublisherValidation。 使用此开关时,重定向的发布服务器将会立即返回到代理,并绕过验证存储过程的执行。

代理历史记录日志中会记录从验证存储过程中返回的故障。 严重性大于或等于 16 的错误会导致代理终止。 这些代理中已经内置了一些重试功能,以便在其故障转移到新的主副本时处理预计会出现的与已发布的数据库断开连接的情况。

日志读取器代理修改

日志读取器代理具有以下更改。

  • 复制的数据库一致性

    当已发布的数据库是可用性组的成员时,默认情况下,日志读取器不会处理尚未在所有可用性组次要副本上强化的日志记录。 这能确保在故障转移时,复制到订阅服务器的所有行也在新的主要副本上同时存在。

    当发布服务器只有两个可用性副本(一个主副本和一个辅助副本)发生故障转移时,原始主副本会保持关闭状态,因为日志读取器不会继续前进,直到所有辅助数据库重新联机或从可用性组中删除失败的辅助副本为止。 现在针对辅助数据库运行的日志读取器不会继续,因为 AG 无法强化对任何辅助数据库的任何更改。 若要允许日志读取器进一步进行处理并且仍具有灾难恢复能力,请使用 ALTER AVAILABITY GROUP <group_name> REMOVE REPLICA 从可用性组中删除原始主要副本。 然后将新的辅助副本添加到可用性组。

  • 跟踪标志 1448

    跟踪标志 1448 使复制日志读取器能够向前移动,即使异步辅助副本尚未确认接收更改。 即使启用了此跟踪标志,日志读取器也始终等待同步次要副本(它们可能成为 此处所述的异步提交模式,因此日志读取器可以向前移动)。 日志读取器不会超出同步次要副本的最小堆栈。 此跟踪标志应用于 SQL Server的实例,而不仅仅应用于可用性组、可用性数据库或日志读取器实例。 必须在发布服务器实例上启用此跟踪标志。 它会立即生效,无需重新启动。 它可提前激活或在异步辅助副本失败时激活。

支持可用性组的存储过程

  • sp_redirect_publisher

    存储过程 sp_redirect_publisher 用于为现有的发布服务器/数据库对指定重定向的发布服务器。 如果发布服务器数据库属于某个可用性组,那么重定向的发布服务器将为可用性组侦听器名称。

  • sp_get_redirected_publisher

    复制代理使用存储过程 sp_get_redirected_publisher 来查询分发服务器,以便确定发布服务器/数据库对是否包含定义的重定向发布服务器。 此存储过程有两个用途。 首先,它允许该代理确定原始发布服务器是否已经重定向。 其次,它还可能在分发服务器(sp_validate_redirected_publisher)启动验证存储过程,以验证重定向的目标节点是否适合用作命名数据库的发布者。

    若要执行此存储过程,调用方必须是 sysadmin 服务器角色的成员、分发数据库的 db_owner 数据库角色的成员,或者是与此发布服务器数据库相关联的已定义发布的 发布访问列表 的成员。

  • sp_validate_redirected_publisher

    此存储过程尝试验证当前发布服务器是否有能力承载已发布的数据库。 可以随时调用它,以验证已发布数据库的当前主机是否有能力支持复制。

  • sp_validate_replicate_hosts_as_publishers

    虽然代理确保当前主数据库可以充当发布服务器的复制发布服务器,但需要更常规的验证功能才能在可用性组数据库上建立整个复制拓扑的有效性。 存储过程 sp_validate_replica_hosts_as_publishers 旨在满足此需求。

    此存储过程总是手动运行。 调用方必须是分发服务器的 sysadmin 、分发数据库的 dbowner ,或者是发布服务器数据库的某一发布的 发布访问列表 的成员。 此外,调用方的登录名必须是对所有可用性副本主机有效的登录名,并且对与发布服务器数据库关联的可用性数据库具有 select 权限。

变更数据捕获过程

启用了变更数据捕获 (CDC) 的数据库能够使用 Always On 可用性组 确保数据库在出现故障时保持可用,而且确保持续监视针对数据库表的更改并将更改存入 CDC 更改表。 CDC 和 AlwaysOn 可用性组的配置顺序并不重要。 可将已启用 CDC 的数据库添加到 AlwaysOn 可用性组,并且可以为 CDC 启用可用性组成员的数据库。 但是,在这两种情况下,CDC 配置都是始终在当前或目标主副本上执行。 CDC 使用日志读取器代理,并具有与本文前面的 日志读取器代理修改 部分中所述相同的限制。

  • 在不复制的情况下捕获变更数据捕获的更改

    如果为数据库启用了 CDC,但复制不是,则捕获过程用于从日志中获取更改,并将其存储在 CDC 更改表中作为其自己的 SQL 代理作业在 CDC 主机中运行。

    为了在故障转移后继续搜集更改,存储过程 sp_cdc_add_job 必须在新的主副本上运行,以创建本地捕获作业。

    下例创建一个捕获作业。

    EXECUTE sys.sp_cdc_add_job @job_type = 'capture';
    
  • 使用复制获取更改数据捕获的更改

    如果为数据库同时启用了 CDC 和复制,日志读取器负责处理 CDC 更改表的填充。 在这种情况下,复制用于使用 AlwaysOn 可用性组的技术可确保从日志中继续获取更改,并在故障转移后存储在 CDC 更改表中。 无需对配置中的 CDC 执行其他任何操作即可填充更改表。

  • 更改数据捕获清理

    为确保在新的主数据库上执行适当的清除,应始终创建本地清除作业。 下例创建一个清除作业。

    EXECUTE sys.sp_cdc_add_job @job_type = 'cleanup';
    

    注意

    在故障转移后,应在新的主要副本上创建作业。 当本地数据库变为辅助数据库时,应禁用旧的主数据库上运行的 CDC 作业。 如果原始副本再次成为主副本,则需要在该副本的副本上重新启用 CDC 作业。 若要禁用和启用作业,请使用sp_update_job@enabled选项。 有关创建 CDC 作业的详细信息,请参阅 sys.sp_cdc_add_job

  • 将 CDC 角色添加到主数据库副本

    为 CDC 启用表后,可以将数据库角色与捕获实例相关联。 如果指定某个角色,则希望使用 CDC 表值函数来访问表更改的用户不仅必须具有对所跟踪的表列的选择访问权限,而且还必须是该指定角色的成员。 如果指定的角色尚不存在,则会创建该角色。 当数据库角色自动添加到可用性组中的主数据库时,这些角色也会传播到可用性组的辅助数据库。

  • 访问 CDC 的客户端应用程序更改数据和可用性组

    使用表值函数 (TVF) 或链接服务器来访问更改表数据的客户端应用程序还需要能够在故障转移后定位到相应的 CDC 主机。 可用性组侦听器名称是 Always On 可用性组 提供的机制,用于以透明的方式允许将连接重定向到其他主机。 可用性组侦听器名称与可用性组关联后,可在 TCP 连接字符串中使用。 通过可用性组侦听器名称,可支持两个不同的连接方案。

    • 其中一个方案确保始终将连接请求定向到当前主要副本副本。
    • 另一个方案则确保将连接请求定向到只读次要副本。

    如果要用来查找只读的辅助副本,则还必须为可用性组定义一个只读的路由列表。 有关路由对可读辅助数据库的访问权限的详细信息,请参阅 为 AlwaysOn 可用性组配置只读路由

    注意

    存在一些传播延迟,与创建可用性组侦听器名称以及客户端应用程序用来访问可用性组数据库副本相关的延迟。

    可使用以下查询来确定是否已为承载 CDC 数据库的可用性组定义了可用性组侦听器名称。 如果已创建可用性组侦听器名称,查询将返回该名称。

    SELECT dns_name
    FROM sys.availability_group_listeners AS l
         INNER JOIN sys.availability_databases_cluster AS d
             ON l.group_id = d.group_id
    WHERE d.database_name = N'MyCDCDB';
    
  • 将查询加载重定向到可读次要副本

    尽管在许多情况下,客户端应用程序始终希望连接到当前主副本,但这不是使用 AlwaysOn 可用性组的唯一方法。 如果将可用性组配置为支持可读的辅助副本,则还可从辅助节点中收集更改数据。

    在配置可用性组之后,可使用与 SECONDARY_ROLE 关联的 ALLOW_CONNECTIONS 属性来指定受支持的辅助访问的类型。 如果配置为 ALL,则允许与辅助数据库的所有连接,但只允许需要只读访问的连接成功。 如果配置为READ_ONLY,则必须在连接到辅助数据库时指定只读意向,以便连接成功。 有关详细信息,请参阅 配置对 AlwaysOn 可用性组的次要副本的只读访问权限

    以下查询可用来确定是否需要只读意向才能连接到可读辅助副本。

    SELECT g.name AS AG,
              replica_server_name,
              secondary_role_allow_connections_desc
    FROM sys.availability_replicas AS r
         INNER JOIN sys.availability_groups AS g
              ON r.group_id = g.group_id
    WHERE g.name = N'MY_AG_NAME';
    

    可用性组侦听器名称或显式节点名称都可用来查找辅助副本。 如果使用可用性组侦听器名称,则访问将定向到任何合适的次要副本。

    用于创建链接服务器以访问辅助服务器时 sp_addlinkedserver@datasrc 参数用于可用性组侦听器名称或显式服务器名称, @provstr 参数用于指定只读意向。

    EXECUTE sp_addlinkedserver
        @server = N'linked_svr',
        @srvproduct = N'SqlServer',
        @provider = N'MSOLEDBSQL',
        @datasrc = N'AG_Listener_Name',
        @provstr = N'ApplicationIntent=ReadOnly',
        @catalog = N'MY_DB_NAME';
    
  • 客户端对 CDC 的访问更改数据和域登录名

    通常,应使用域登录名进行客户端访问,以更改驻留在可用性组成员数据库中的数据。 为了确保在故障转移后继续访问更改数据,域用户需要对所有支持可用性组副本的主机上的访问权限。 如果将一个数据库用户添加到主副本中的数据库,则会将该用户与一个域登录名关联,然后将该数据库用户传播到辅助数据库,并且继续与指定的域登录名关联。 如果新的数据库用户与 SQL Server 身份验证登录名相关联,则辅助数据库中的用户在没有登录名的情况下传播。 尽管可以使用关联的 SQL Server 身份验证登录名来访问最初定义数据库用户的主副本上的更改数据,但该节点是能够进行访问的唯一节点。 SQL Server 身份验证登录名无法从任何辅助数据库访问数据,也无法从定义数据库用户的原始数据库以外的任何新的主数据库访问数据。

  • 禁用变更数据捕获

    如果需要在属于可用性组的数据库上禁用变更数据捕获(CDC),并且你使用的是 SQL Server 2016 SP2 或更高版本,则无需执行任何额外的步骤来自动截断日志。 如果使用的是低于 SQL Server 2016 SP2 的版本,并且禁用可用性组一部分的数据库上的 CDC,则需要实现以下步骤之一,以防止在禁用 CDC 后阻止日志截断:

    • 重启每个次要副本实例上的 SQL Server 服务。

    • 从可用性组的所有辅助副本实例中删除数据库,然后使用自动或手动种子设定将其添加回每个可用性组副本实例。

更改跟踪

为更改跟踪(CT)启用的数据库可以是可用性组的一部分。 不需要其他配置。 使用 CDC 表值函数(TVF)访问更改数据的跟踪客户端应用程序需要在故障转移后找到主副本。 如果客户端应用程序通过可用性组侦听器名称进行连接,则连接请求始终正确定向到当前主副本。

必须始终从主副本中获取更改跟踪数据。 尝试从次要副本访问更改数据将导致以下错误:

Msg 22117, Level 16, State 1, Line 1

对于属于辅助副本(即辅助数据库)成员的数据库,不支持更改跟踪。 作为在主副本上运行更改跟踪查询的替代方法,可以从次要副本创建 AG 数据库的数据库快照,然后使用它来查询更改数据。 数据库快照是 SQL Server 数据库(源数据库)的只读静态视图,因此更改跟踪数据库快照中的数据是从次要副本对 AG 数据库拍摄快照的时间。

注意

在启用了更改跟踪的数据库上发生故障转移时,新主副本上的恢复时间可能比平时要长,因为更改跟踪需要重启完整数据库。

使用复制的先决条件、限制和注意事项

本节介绍使用 Always On 可用性组部署复制时的注意事项,包括先决条件、限制和建议。

先决条件

  • 在使用事务复制并且发布数据库位于可用性组中时,发布服务器和分发服务器都必须至少运行 SQL Server 2012 (11.x)。 订阅服务器可以使用较低级别的 SQL Server。

  • 在使用合并复制并且发布数据库位于某一可用性组中时:

    • 推送订阅:发布服务器和分发服务器必须至少运行 SQL Server 2012 (11.x)。

    • 请求订阅:发布服务器、分发服务器和订阅服务器数据库都必须至少位于 SQL Server 2012 (11.x) 中。 这是因为订阅服务器上的合并代理必须知道可用性组如何将故障转移到其辅助代理。

  • 发布服务器实例满足参与可用性组所需的所有先决条件。 有关详细信息,请参阅 AlwaysOn 可用性组的先决条件、限制和建议

限制

针对 Always On 可用性组的复制所支持的组合:

复制 发布者 分发服务器 1 订阅者
事务性

注意:不包括对双向和相互事务复制的支持。
对等2 3
合并
快照
可更新订阅 - 用于事务复制

1 不支持分发服务器数据库用于数据库镜像。

2 需要 SQL Server 2019 CU 13 或更高版本。

3 需要 SQL Server 2019 CU 17 或更高版本。

注意事项

  • 分发数据库不支持用于数据库镜像,但 AlwaysOn 可用性组受某些限制支持。 有关详细信息,请参阅 “配置分发可用性组”。 复制配置与配置分发服务器的 SQL Server 实例耦合;因此,无法镜像或复制分发数据库。 还可以使用 SQL Server 故障转移群集为分发服务器提供高可用性。 有关详细信息,请参阅 AlwaysOn 故障转移群集实例(SQL Server)。

  • 尽管支持订阅服务器故障转移到辅助数据库,但这是用于合并复制订阅服务器的手动过程。 该过程与故障转移镜像的订阅服务器数据库所用的方法基本相同。 参与 AlwaysOn 可用性组时,事务复制订阅服务器不需要特殊处理。 订阅服务器必须运行 SQL Server 2012 (11.x) 或更高版本才能加入可用性组。 有关详细信息,请参阅 复制订阅服务器和 AlwaysOn 可用性组(SQL Server)

  • 数据库中存在的元数据和对象不会传播到辅助副本,包括登录名、作业、链接服务器。 如果您在故障转移后需要新的主数据库中有元数据和对象,则必须手动复制它们。 有关详细信息,请参阅 使用 AlwaysOn 可用性组中的数据库管理作业的登录名

分布式可用性组

可用性组中的发布服务器或分发数据库不能配置为分布式可用性组的一部分。 可用性组中的发布服务器数据库和可用性组中的分发数据库都需要侦听器终结点才能正确配置和使用。 但是,无法为分布式可用性组配置侦听器终结点。

复制

变更数据捕获过程

更改跟踪