什么是包含的可用性组?

适用于: SQL Server 2022 (16.x)

包含的可用性组是 Always On 可用性组 (AG),它支持:

  • 在 AG 级别以及实例级别管理元数据对象(用户、登录名、权限、SQL 代理作业等)。

  • AG 中的专用包含系统数据库。

本文详细介绍了包含的 AG 的相似之处、不同之处和功能。

概述

AG 通常由一个或多个用户数据库组成,这些用户数据库旨在作为协调组运行,并且会在群集中的一些节点上进行复制。 当节点出现故障或托管主副本的节点上的 SQL Server 运行状况出现故障时,数据库组将作为一个单元移动到 AG 中的其他副本节点。 无论是在同步模式还是异步模式下,所有用户数据库在 AG 的所有副本中都会保持同步。

这适用于仅与该组用户数据库交互的应用程序,但是当应用程序还依赖于存储在其中一个系统数据库(mastermsdb)中的对象(例如用户、登录名、权限、代理作业等)时,就会遇到一些挑战。 为了使应用程序能够顺利且以可预测的方式运行,管理员必须手动确保对这些对象的任何更改都会复制到 AG 中的所有副本实例中。 如果将新实例引入 AG,则可以通过简单的过程自动或手动播种数据库,但随后必须在新实例上重新配置所有系统数据库自定义项以匹配其他副本。

包含的 AG 扩展了复制的数据库组的概念,以包括 mastermsdb 数据库的相关部分。 可将其视为使用包含的 AG 的应用程序的执行上下文。 其理念是,包含的 AG 环境包括会影响依赖于它们的应用程序的设置。 因此,包含的 AG 环境涉及应用程序与之交互的所有数据库、它使用的身份验证(登录名、用户、权限)、它期望运行的任何计划作业以及影响该应用程序的其他配置设置。

这与包含的数据库不同,包含的数据库对用户帐户使用不同的机制,将用户信息存储在数据库本身中。 包含的数据库仅复制登录名和用户,并且复制的登录名或用户的范围仅限于该单个数据库(及其副本)。

相反,在包含的 AG 中,你可以在 AG 级别创建用户、登录名和权限等,并且它们将自动在 AG 中的副本之间保持一致,并在该包含 AG 中的数据库之间保持一致。 这样管理员便不必自己手动进行这些更改。

SQL Server 2025 更新

SQL Server 2025 (17.x) 预览版引入了对包含的可用性组的分布式可用性组支持。

差异

在使用包含的 AG 时需要考虑一些实际差异,例如包含的系统数据库的创建,以及在包含的 AG 级别强制进行连接,而不是在实例级别进行连接。

包含的系统数据库

每个包含的 AG 都有自己的 mastermsdb 系统数据库,它们以该可用性组的名称命名。 例如,在包含的 AG MyContainedAG 中,你有名为 MyContainedAG_masterMyContainedAG_msdb 的数据库。 这些系统数据库会自动播种到新的副本中,并且更新会复制到这些数据库,就像可用性组中的任何其他数据库一样。 这意味着,在连接到包含的 AG 时,如果添加登录或代理作业等对象,或包含的 AG 故障转移到其他实例,则你仍会看到该代理作业,并且能够使用在包含的 AG 中创建的登录名进行身份验证。

重要说明

包含的 AG 是一种机制,用于使执行环境配置在可用性组的副本之间保持一致。 它们表示安全边界。 例如,不存在阻止与包含的 AG 的连接访问 AG 外部的数据库的边界。

新创建的包含的 AG 中的系统数据库不是运行 CREATE AVAILABILITY GROUP 命令的实例的副本。 它们最初是没有任何数据的空模板。 创建后,立即将创建包含的 AG 的实例上的管理员帐户复制到包含的 AG master 中。 这样,管理员可以登录到包含的 AG 并设置其余配置。

如果在实例中创建了本地用户或配置,则在创建包含的系统数据库时它们不会自动出现,并且在连接到包含的 AG 时它们将不可见。 一旦用户数据库加入到包含的 AG,这些用户将立即无法访问该数据库。 你需要在包含 AG 的上下文中,通过直接连接到数据库或使用侦听器端点,在包含的系统数据库中手动重新创建它们。 例外情况是,在创建包含的 AG 期间,父实例中 sysadmin 角色的所有登录名都被复制到新的 AG 特定 master 数据库中。

注意

由于 master 数据库对于每个包含的可用性组都是独立的,因此在包含的 AG 上下文中执行的服务器范围活动仅保留在包含的系统数据库中。 这包括审核。 如果使用 SQL Server 审核功能来审核服务器级别的活动,则必须在每个包含的 AG 内创建相同的服务器审核。

初始数据同步

包含的系统数据库仅支持自动播种,作为初始数据同步方式。

在 SQL Server 2022 (16.x) 和早期版本中,包含的可用性组必须在创建过程中使用自动种子设定。 在 SQL Server Management Studio 中使用 CREATE AVAILABILITY GROUP 语句或使用新建可用性组的向导时,仅包含支持自动播种的用户数据库。 若要使用手动种子设定添加大型数据库 (JOIN ONLY),请等到创建包含的 AG 之后。

在 SQL Server 2025 (17.x) 预览版中,包含的系统数据库始终使用自动种子设定,即使 CREATE AVAILABILITY GROUP 语句指定手动种子设定也是如此。 你可以将种子设定模式设置为手动,以创建包含的 AG,然后使用自动种子设定以外的同步方法添加用户数据库。

还原包含的系统数据库

若要还原包含的系统数据库的备份,请执行以下步骤:

  1. 丢弃包含的 AG。

  2. 在包含的 AG 的原始主副本上还原包含的 mastermsdb 数据库。

  3. 从次要复制品中删除包含 mastermsdb 的数据库。

  4. 在主副本上,使用 WITH (CONTAINED, REUSE_SYSTEM_DATABASES)SEEDING_MODE = AUTOMATIC 语法,根据原始名称和节点重新创建包含的 AG。

重新创建包含的可用性组时,不要在 CREATE AVAILABILITY GROUP 语句中包含包含的系统数据库。 当指定REUSE_SYSTEM_DATABASES时,SQL Server会自动检测它们。 在 SQL Server 2022(16.x)及更早的版本中,只应包含支持自动播种的小型用户数据库。 使用 JOIN ONLY 在创建包含的 AG 后单独添加大型数据库。

包含的可用性组作业

属于受限可用性组的作业仅在主副本上运行。 它们不会在次要副本上运行。

连接(包含的环境)

区分连接到实例和连接到包含的 AG 之间的区别很重要。 访问包含的 AG 环境的唯一方法是连接到包含的 AG 侦听程序,或者连接到包含的 AG 中的数据库。

"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=MyContainedDatabase;
Server=MyServer;"

其中 MyContainedDatabase 是包含的 AG 中你希望与之交互的数据库。

这意味着,必须为包含的 AG 创建一个侦听程序才能有效地使用包含的 AG。 如果连接到托管包含的 AG 的实例之一,而不是通过侦听程序直接连接到包含的 AG,则你将处于实例环境中,而不是包含的 AG 环境中。

例如,如果可用性组 MyContainedAG 托管在服务器 SERVER\MSSQLSERVER 上,并且你没有连接到侦听程序 MyContainedAG_Listener,而是使用 SERVER\MSSQLSERVER 连接到实例,则你将处于实例环境中,而不是 MyContainedAG 环境中。 这意味着你将受制于实例的系统数据库中找到的内容(用户、权限、作业等)。 要访问在包含的 AG 的包含的系统数据库中找到的内容,请改为连接到包含的 AG 侦听程序(例如 MyContainedAG_Listener)。 当通过包含的 AG 侦听程序连接到实例时,如果与 master 交互,则实际上会被重定向到包含的 master 数据库(例如,MyContainedAG_master)。

只读路由和包含的可用性组

如果已将只读路由配置为将具有读取意图的连接重定向到次要副本(请参阅为 Always On 可用性组配置只读路由),并且希望使用仅在包含的 AG 中创建的登录名进行连接,则还存在一些其他注意事项:

  • 必须指定一个数据库,该数据库是连接字符串中包含的 AG 的一部分
  • 连接字符串中指定的用户必须有权访问包含的 AG 中的数据库。

例如,在以下连接字符串中,AdventureWorks 是包含的 AG(包含 MyContainedListener)中的数据库,其中 MyUser 是在包含的 AG 中定义的用户并且没有任何参与实例:

"Persist Security Info=False;
User ID=MyUser;Password=*****;
Initial Catalog=AdventureWorks;
Server=MyContainedListener;
ApplicationIntent=ReadOnly"

此连接字符串将使你连接到只读路由配置中的可读辅助,并且你将处于包含的 AG 的上下文中。

连接到实例和连接到包含的可用性组之间的差异

  • 当连接到包含的 AG 时,用户将只能看到包含的 AG 中的数据库以及 tempdb
  • 在实例级别,包含的 AG mastermsdb 名称为 [contained AG]_master[contained AG]_msdb。 在包含的 AG 中,其名称是 mastermsdb
  • 包含的 AG master 的数据库 ID 在包含的 AG 内为 1,但在连接到实例时为其他值。
  • 虽然在包含的 AG 连接中连接时,用户不会在 sys.databases 中看到包含的 AG 之外的数据库,但他们将能够通过三部分名称或通过 USE 命令访问这些数据库。
  • 通过 sp_configure 的服务器配置可以从包含的 AG 连接中读取,但只能从实例级别写入。
  • 在包含的 AG 连接中,系统管理员能够执行实例级别的操作,例如关闭 SQL Server。
  • 大多数数据库级别、终结点级别或 AG 级别的操作只能通过实例连接执行,而不是包含的 AG 连接。

与其他功能的交互

将某些功能与包含的 AG 一起使用时,还有一些其他注意事项,并且某些功能当前不受支持。

备份

备份包含的 AG 中的数据库的过程与任何用户数据库备份过程相同。 对于包含的 AG 用户数据库和包含的 AG 系统数据库,这都是如此。

如果备份位置为本地,备份文件将放置在运行备份作业的服务器上。 这意味着备份文件可能位于不同的位置。

如果备份位置位于网络资源上,则承载副本的所有服务器都需要访问该资源。

分布式可用性组

分布式可用性组是一种特殊类型的可用性组,它跨越两个基础可用性组。 配置分布式可用性组时,对全局主副本(即第一个 AG 的主副本)所做的更改随后会复制到第二个 AG 的主副本,称为转发器。

从 SQL Server 2025(17.x) 预览版开始,可以在两个包含的 AG 之间配置分布式可用性组。 由于包含的 AG 依赖于包含的 mastermsdb 系统数据库,因此要创建分布式可用性组,第二个 AG(转发器)必须具有与全局主节点相同的包含的 AG 系统数据库。

如果你打算将包含的 AG 用作分布式可用性组中的转发器,则必须通过使用 CREATE AVAILABILITY GROUP 语句的 WITH | CONTAINED 选项的 AUTOSEEDING_SYSTEM_DATABASES 子句来创建包含的 AG。 AUTOSEEDING_SYSTEM_DATABASES 子句告知 SQL Server 跳过创建其自己的包含的 AG 系统数据库,转而从全局主数据库中为包含的 AG 系统数据库设定种子。

资源调控器

在累积更新 18 之前的 SQL Server 2022(16.x)以及更早版本中,不支持在包含可用性组连接上配置或使用资源调控器。

从 SQL Server 2022 (16.x) 累积更新 18 开始,如果在实例连接上配置资源调控器,则实例连接上的资源消耗或包含的可用性组连接将按预期进行管理。 如果尝试在包含的可用性组连接上配置资源调控器,将收到错误。

资源调控器在数据库引擎实例级别工作。 实例级别的资源调控器配置不会传播到可用性副本。 必须在托管可用性副本的每个实例上配置资源调控器。

小窍门

建议对所有托管可用性副本的数据库引擎实例使用相同的资源调控器配置,以确保可用性组故障转移发生时的行为一致。

有关详细信息,请参阅 资源调控器 和资源 调控器配置示例和最佳做法

变更数据捕获

变更数据捕获 (CDC) 是作为 SQL 代理作业实现的,因此 SQL 代理需要在包含的 AG 中具有副本的所有实例上运行。

要对包含的 AG 使用变更数据捕获,请在配置 CDC 时连接到 AG 侦听程序,以便使用包含的系统数据库配置 CDC 元数据。

日志传送

如果源数据库位于包含的 AG 中,则可以配置日志传送。 但是,包含的 AG 中不支持日志传送目标。 此外,在配置 CDC 后,还需要一个额外的步骤来修改日志传送操作。

若要使用包含的 AG 配置日志传送,请执行以下步骤:

  1. 连接包含的 AG 侦听程序。
  2. 照常配置日志传送
  3. 配置日志传送操作后,更改该操作以连接到包含的 AG 侦听程序,然后再进行备份。

透明数据加密 (TDE)

要将透明数据加密 (TDE) 与包含的 AG 中的数据库一起使用,请手动将数据库主密钥 (DMK) 安装到包含的 AG 中的包含的 master 数据库。

使用 TDE 的数据库依赖于 master 数据库中的证书来解密数据库加密密钥 (DEK)。 如果没有该证书,SQL Server 将无法解密使用 TDE 加密的数据库或使它们联机。 在包含的可用性组中,SQL Server 将查看 master 数据库中的 DMK 和 master 数据库中的实例,以及包含的 AG 中包含的 master 数据库来解密数据库。 如果在这两个位置都找不到证书,则 SQL Server 将无法使数据库联机。

要将 DMK 从实例的 master 数据库传输到包含的 master 数据库,请参阅将受 TDE 保护的数据库移到其他 SQL Server,主要关注将 DMK 从旧服务器传输到新服务器的部分。

注意

加密 SQL Server 实例上的任何数据库会同时 加密 tempdb 系统数据库

SSIS 包和维护计划

包含的可用性组不支持使用 SSIS 包(包括维护计划)。

不支持

目前,包含的 AG 不支持以下 SQL Server 功能:

  • 任何类型的 SQL Server 复制(事务、合并、快照等)。
  • 日志传送,其中目标数据库位于包含的 AG 中。 支持源数据库位于包含的 AG 中的日志传送。

DDL 更改

唯一的 DDL 更改是在 CREATE AVAILABILITY GROUP 工作流中。 WITH 条款中有两个选项。

<with_option_spec> ::=
CONTAINED [REUSE_SYSTEM_DATABASES | AUTOSEEDING_SYSTEM_DATABASES ]

包含

这指定了正在创建的 AG 应该是一个包含的 AG。

REUSE_SYSTEM_DATABASES

REUSE_SYSTEM_DATABASES 选项仅对包含的 AG 有效,并指定新创建的 AG 应为以前的同名包含的 AG 重用现有的包含的系统数据库。 例如,如果有名为 MyContainedAG 的包含的 AG,并且想要删除并重新创建它,则可以使用此选项来重用原始包含的系统数据库的内容。 使用此选项时,请勿指定系统数据库名称。 SQL Server 会自动检测它们。

AUTOSEEDING_SYSTEM_DATABASES

适用于:SQL Server 2025 (17.x) 预览版及更高版本

如果打算将包含的 AG 用作分布式可用性组中的转发器,则必须在AUTOSEEDING_SYSTEM_DATABASES包含的 AG 时使用此选项。 此选项告知 SQL Server 跳过创建其自己的包含的 AG 系统数据库,转而从全局主数据库中为包含的 AG 系统数据库设定种子。

DMV 更改

对与包含的 AG 相关的 DMV 有两个新增内容:

  • DMV sys.dm_exec_sessions 添加了一个列:contained_availability_group_id
  • sys.availability_groups 目录视图添加了一个列:is_contained