什么是包含的可用性组?

适用于: 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 中的数据库之间保持一致。 这样管理员便不必自己手动进行这些更改。

差异

在使用包含的 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 的上下文中,通过直接连接到数据库或使用侦听器端点,在包含的系统数据库中手动重新创建它们。 例外情况是,父实例中 sysadmin 角色的所有登录名都被复制到新的 AG 特定 master 数据库中。

还原包含的系统数据库

可使用两种不同的方法之一还原包含的系统数据库。

  • 使用次要副本还原包含的数据库

    1. 为每个还原操作使用 RESTORE WITH NORECOVERY,将包含的 mastermsdb 数据库还原到承载次要副本的服务器实例上。 有关详细信息,请参阅为 Always On 可用性组准备辅助数据库

    2. 将每个包含的数据库联接到可用性组。 有关详细信息,请参阅将辅助数据库联接到 Always On 可用性组

  • 通过丢弃包含的 AG 来还原包含的数据库

    1. 丢弃包含的 AG。

    2. 在参与包含的 AG 的每个实例中还原包含的 mastermsdb 数据库。

    3. 使用原始节点和名称,并使用 WITH (CONTAINED, REUSE_SYSTEM_DATABASES) 语法重新创建包含的 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 不支持以下 SQL Server 功能:

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

更改数据捕获

变更数据捕获 (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 加密的数据库或使它们联机。 在包含的 AG 中,SQL Server 将查看 master 数据库中的 DMK 和 master 数据库中的实例,以及包含的 AG 中包含的 master 数据库来解密数据库。 如果在这两个位置都找不到证书,则 SQL Server 将无法使数据库联机。

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

SSIS 包和维护计划

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

DDL 更改

唯一的 DDL 更改在 CREATE AVAILABILITY GROUP 工作流中。 有两个新的 WITH 子句:

<with_option_spec> ::=
CONTAINED |
REUSE_SYSTEM_DATABASES

CONTAINED

这指定所创建的 AG 应为包含的 AG。

REUSE_SYSTEM_DATABASES

此选项仅对包含的 AG 有效,并指定新创建的 AG 应为以前的同名包含的 AG 重用现有的包含的系统数据库。 例如,如果有名为 MyContainedAG 的包含的 AG,并且想要删除并重新创建它,则可以使用此选项来重用原始包含的系统数据库的内容。

DMV 更改

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

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