修复:将累积更新应用到包含可用性组的 SQL Server 实例后,会发生错误

现象

假设出现了下面这种情景:

  • 你有一个 SQL Server 2022 实例,其中包含已部署的可用性组。
  • 在包含的可用性组的上下文中创建服务器级对象(登录名和作业)。

在此方案中,在 SQL Server 实例上安装累积更新后,会发生以下错误之一。

错误 1

SQL Server 代理作业失败,并显示以下错误消息:

无法开始执行步骤 2(原因:JobOwner <JobOwner> 无权对子系统 SSIS 使用代理 <#> )。  该步骤失败。

可以看到SQL Server 代理错误日志记录错误消息,类似于以下错误消息:

<时间戳> - ! [298] SQLServer 错误:208,对象名称“syssubsystems”无效。 [SQLSTATE 42S02]
<时间戳> - ! [517] SQL 错误号 208,严重性 16

在此阶段, syssubsystems 该表缺少 msdb 包含的可用性组的数据库,并且存在于实例级 msdb 数据库中。 若要修复这些错误并允许作业成功运行,可以通过连接到侦听器并创建表中的表和行,将实例级 syssubsystemsmsdb 手动复制到包含可用性组的数据库。

错误 2

创建包含的可用性组后,每隔五秒看到以下错误消息:

激活的 proc '[dbo]。在队列“<AGName>_AG_SYNC_CONTAINED_msdb.dbo.syspolicy_event_queue”上运行的 [sp_syspolicy_events_reader]“输出以下内容:”无法作为数据库主体执行,因为主体“##MS_PolicyEventProcessingLogin##”不存在,无法模拟这种类型的主体,或者您没有权限。

错误 3

数据库邮件停止工作后,尝试运行sysmail存储过程将报告如下所示的错误消息:

对象“[dbo]。[sp_syspolicy_events_reader]“ 在数据库”master“中不存在,或者对于此操作无效。

错误 4

创建包含的可用性组后,如果连接到包含的可用性组侦听器并创建 SQL Server 登录主体,则使用登录主体进行连接时,SQL Server Management Studio (SSMS) 中将收到以下错误:

连接到 <侦听器时出错>
无法为此请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
对对象“xp_msver”、“数据库”mssqlsystemresource“、架构”sys“拒绝 EXECUTE 权限。 (Microsoft SQL Server,错误: 229)

发生此错误的原因是该 public 角色未授予 EXECUTE 对包含可用性组 (AG) 主节点上扩展存储过程的权限 xp_msver

解决方法

此问题已在 SQL Server 的以下累积更新中修复:

SQL Server 2022 累积更新 4

关于 SQL Server 的累积更新

SQL Server 的每个新的累积更新都包含上一个版本中的所有修补程序和安全修补程序。 建议为 SQL Server 版本安装最新版本:

SQL Server 2022 的最新累积更新

Status

Microsoft目前正在调查这些问题。 在找到更多信息或指南时,本文将更新。 在此之前,在安装包含可用性组的安装的累积更新之前,可以采取以下必要的预防措施:

  • 编写服务器级对象和SQL Server 代理对象的脚本。
  • 删除包含的可用性组。
  • 应用累积更新。
  • 重新创建包含的可用性组。

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

参考

了解 Microsoft 用于描述软件更新的术语