介绍

SQL Server 2022 引入了包含的可用性组的新概念。这是 DBA 自 10 年前引入可用性组以来一直在等待的事情。

包含的可用性组通过在数据库副本之间复制系统对象(如 SQL 代理作业、登录名和链接服务器)的功能来增强可用性组。

在这篇博客文章中,我们将使用 SQL Server 2022 CTP2.0 首先了解即将推出的包含的可用性组。

目录

  • 包含的可用性组
  • 创建包含的可用性组
  • SSMS 中包含的可用性组
  • DMV 变更
  • 通过侦听器连接
  • 创建代理作业
  • 创建登录名
  • 执行故障转移
  • 删除包含的可用性组
  • 重用旧的包含可用性组系统数据库
  • 结语

包含的可用性组

自从在 SQL Server 2012 中引入可用性组以来,多个副本之间的同步仅涉及用户数据库。
当应用程序还依赖于存储在系统数据库(master 或 msdb)中的对象(如用户、登录名、权限、代理作业等)时,存在挑战。
这种类型的对象必须由 DBA 手动复制或编写脚本,例如使用 dbatools。

包含的可用性组通过为每个可用性组自动创建 master 数据库和 msdb 数据库来解决此问题,该可用性组会自动复制在其上下文中创建的对象。

创建包含的可用性组

SSMS 向导包含一个默认情况下未选中的新复选框。

 

SQL SERVER 2022新 sql server 2022新特性_SQL SERVER 2022新

 

“创建可用性组”命令有一个新的 T-SQL 关键字:

CREATE AVAILABILITY GROUP [ContainedAG02]
WITH (
	AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
	REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0,
	CONTAINED
)
FOR DATABASE [appdb02] 
REPLICA ON N'SQL19VM1\SQL2022A' [...]

SSMS 中包含的可用性组

master 和 msdb 数据库在 SSMS 中的“可用性数据库”文件夹下可见,在主“用户”数据库列表中也可见。

 

SQL SERVER 2022新 sql server 2022新特性_SQL_02

 

添加另一个包含的AG当然会带来更多这样的数据库。

 


SQL SERVER 2022新 sql server 2022新特性_SQL SERVER 2022新_03

 

 

 

 

DMV 变更

请注意,sys.availability_groups DMV 有一个名为 is_contained 的新列。

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

SQL SERVER 2022新 sql server 2022新特性_包含可用性组_05

 

 

通过侦听器连接

有趣的是,当通过侦听器连接时,您只能看到与该侦听器相关的包含AG相关的数据库。

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

SQL SERVER 2022新 sql server 2022新特性_SQL_07

 

 

这不是未包含的“正常”可用性组的行为。

 

SQL SERVER 2022新 sql server 2022新特性_包含可用性组_08

 

 

创建代理作业

我创建了 2 个具有不同范围的代理工作。范围是在连接时定义的,因为“新建作业”向导中目前没有将作业设置为包含的 AG 或实例级别相关作业的更改。

-- Connect to primary replica on default database
USE msdb
GO
DECLARE @jobId BINARY(16)
EXEC  msdb.dbo.sp_add_job @job_name=N'test_ContainedAG', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=2, 
		@notify_level_page=2, 
		@delete_level=0, 
		@category_name=N'[Uncategorized (Local)]', 
		@owner_login_name=N'sa', @job_id = @jobId
GO
-- Connect to ContainedAG01 on default database
USE msdb
GO
DECLARE @jobId BINARY(16)
EXEC  msdb.dbo.sp_add_job @job_name=N'test_ContainedAG', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=2, 
		@notify_level_page=2, 
		@delete_level=0, 
		@category_name=N'[Uncategorized (Local)]', 
		@owner_login_name=N'sa', @job_id = @jobId
GO

结果(如 SSMS 中所示)是包含的 AG 仅显示其相关作业。我发现令人不安的是,作为连接到我的实例的系统管理员,我看不到 ContainedAG 作业,而只看到实例范围。

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

SQL SERVER 2022新 sql server 2022新特性_SQL Server_10

 

 

我可以看到这在管理具有多个 ContainedAG 和数十个作业的实例时会造成很多混乱。

SQL也是如此。

select name
from msdb..sysjobs
go

select name
from ContainedAG01_msdb..sysjobs

 

SQL SERVER 2022新 sql server 2022新特性_数据库_11

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

 

创建登录名

登录名和用户也是如此;用户界面没有变化。必须在 T-SQL 中的正确范围内创建它们。

SQL SERVER 2022新 sql server 2022新特性_数据库_13

 

连接到侦听器时的登录

 

SQL SERVER 2022新 sql server 2022新特性_数据库_14

 

 

接到实例时的登录

 

执行故障转移

故障转移向导显示受故障转移操作影响的主数据库和 msdb 数据库。

SQL SERVER 2022新 sql server 2022新特性_SQL_15

 

 

 

与包含的 AG 相关的所有对象(此处仅登录名和作业)在辅助副本上进行故障转移后也可用,而无需“手动”/“DBA”对象同步。

SELECT @@SERVERNAME AS ServerName
	, ag.name AS AgName
	, dc.[database_name]
	, rs.is_primary_replica
	, rs.synchronization_state_desc 
FROM sys.dm_hadr_database_replica_states AS rs
	INNER JOIN sys.availability_databases_cluster AS dc
		ON rs.group_id = dc.group_id 
		AND rs.group_database_id = dc.group_database_id
	INNER JOIN sys.availability_groups AS ag
		ON ag.group_id = rs.group_id
WHERE is_primary_replica = 1

select name, sysadmin
from master.sys.syslogins
where name not like '##%' and name not like 'NT%'

select name
from msdb..sysjobs

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

故障转移后包含的 AG 对象

 

删除包含的可用性组

删除包含的可用性组不会删除 master 数据库和 msdb 数据库。

 


SQL SERVER 2022新 sql server 2022新特性_数据库_04

SQL SERVER 2022新 sql server 2022新特性_SQL SERVER 2022新_18

 


 

SQL SERVER 2022新 sql server 2022新特性_SQL_19

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

 

 

重用旧的包含可用性组系统数据库

现在,我可以通过重用旧的 msdb 和 master 数据库来重新创建新的可用性组。
这是可以检查“重用系统数据库”的时候。

SQL SERVER 2022新 sql server 2022新特性_SQL_21

 


 

正如您在上面看到的,我尝试使用带有后缀“_bis”的新包含可用性组名称。
它没有按计划进行。未检测到 master 和 msdb 数据库,但将其视为简单的用户数据库。

SQL SERVER 2022新 sql server 2022新特性_数据库_04

 

SQL SERVER 2022新 sql server 2022新特性_SQL SERVER 2022新_23

 

 

使用原始名称的第二次尝试效果不佳。

SQL SERVER 2022新 sql server 2022新特性_SQL_24

 

 

SQL SERVER 2022新 sql server 2022新特性_数据库_04

 

实际上,需要在此向导面板上取消选择主节点和 msdb。只需选择用户数据库。
msdb 和 master 数据库将根据其名称与包含的 AG 名称匹配来重用。

SQL SERVER 2022新 sql server 2022新特性_SQL SERVER 2022新_26

 

这也可以在向导中进行改进,以明确这些数据库属于特殊类型,并且在选择“重用系统数据库”选项时可能应将其添加为包含的 AG 中的用户数据库。

结语

此博客文章只是对使用 SQL Server 2022 CTP2.0 和 SSMS 19 预览版的包含可用性组的基本介绍。功能包含的 AG 功能似乎按预期工作,但可能需要对 SSMS 和 DMV 进行一些重要的改进,以使对象(登录名、代理作业等)的范围(包含或实例)更清晰,更易于管理。