介绍
SQL Server 2022 引入了包含的可用性组的新概念。这是 DBA 自 10 年前引入可用性组以来一直在等待的事情。
包含的可用性组通过在数据库副本之间复制系统对象(如 SQL 代理作业、登录名和链接服务器)的功能来增强可用性组。
在这篇博客文章中,我们将使用 SQL Server 2022 CTP2.0 首先了解即将推出的包含的可用性组。
目录
- 包含的可用性组
- 创建包含的可用性组
- SSMS 中包含的可用性组
- DMV 变更
- 通过侦听器连接
- 创建代理作业
- 创建登录名
- 执行故障转移
- 删除包含的可用性组
- 重用旧的包含可用性组系统数据库
- 结语
包含的可用性组
自从在 SQL Server 2012 中引入可用性组以来,多个副本之间的同步仅涉及用户数据库。
当应用程序还依赖于存储在系统数据库(master 或 msdb)中的对象(如用户、登录名、权限、代理作业等)时,存在挑战。
这种类型的对象必须由 DBA 手动复制或编写脚本,例如使用 dbatools。
包含的可用性组通过为每个可用性组自动创建 master 数据库和 msdb 数据库来解决此问题,该可用性组会自动复制在其上下文中创建的对象。
创建包含的可用性组
SSMS 向导包含一个默认情况下未选中的新复选框。
“创建可用性组”命令有一个新的 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 中的“可用性数据库”文件夹下可见,在主“用户”数据库列表中也可见。
添加另一个包含的AG当然会带来更多这样的数据库。
DMV 变更
请注意,sys.availability_groups DMV 有一个名为 is_contained 的新列。
通过侦听器连接
有趣的是,当通过侦听器连接时,您只能看到与该侦听器相关的包含AG相关的数据库。
这不是未包含的“正常”可用性组的行为。
创建代理作业
我创建了 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 作业,而只看到实例范围。
我可以看到这在管理具有多个 ContainedAG 和数十个作业的实例时会造成很多混乱。
SQL也是如此。
select name
from msdb..sysjobs
go
select name
from ContainedAG01_msdb..sysjobs
创建登录名
登录名和用户也是如此;用户界面没有变化。必须在 T-SQL 中的正确范围内创建它们。
连接到侦听器时的登录
接到实例时的登录
执行故障转移
故障转移向导显示受故障转移操作影响的主数据库和 msdb 数据库。
与包含的 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
故障转移后包含的 AG 对象
删除包含的可用性组
删除包含的可用性组不会删除 master 数据库和 msdb 数据库。
重用旧的包含可用性组系统数据库
现在,我可以通过重用旧的 msdb 和 master 数据库来重新创建新的可用性组。
这是可以检查“重用系统数据库”的时候。
正如您在上面看到的,我尝试使用带有后缀“_bis”的新包含可用性组名称。
它没有按计划进行。未检测到 master 和 msdb 数据库,但将其视为简单的用户数据库。
使用原始名称的第二次尝试效果不佳。
实际上,需要在此向导面板上取消选择主节点和 msdb。只需选择用户数据库。
msdb 和 master 数据库将根据其名称与包含的 AG 名称匹配来重用。
这也可以在向导中进行改进,以明确这些数据库属于特殊类型,并且在选择“重用系统数据库”选项时可能应将其添加为包含的 AG 中的用户数据库。
结语
此博客文章只是对使用 SQL Server 2022 CTP2.0 和 SSMS 19 预览版的包含可用性组的基本介绍。功能包含的 AG 功能似乎按预期工作,但可能需要对 SSMS 和 DMV 进行一些重要的改进,以使对象(登录名、代理作业等)的范围(包含或实例)更清晰,更易于管理。