我们的一项复制作业在第 3 步失败,该步骤运行sp_MSdetect_nonlogged_shutdown,返回一个'String or binary data would be truncated'。这当然使我们走上了试图在数据库中找到问题的道路。但是,我们比较了这两个数据库,它们是相同的。据我所知,该错误实际上是sp_MSdetect_nonlogged_shutdown中的一个错误。
最终,我再次检查了作业,第 2 步也失败并抛出了一个小型转储。当我们查看转储时,它说:
线程试图读取或写入它没有适当访问权限的虚拟地址
运行作业的 id 是一个 SQL id,即 sysadmin,步骤 (2) 是在代理服务帐户下运行的。服务帐户有权访问快照目录。我们有多个使用相同安全设置的其他复制作业,它们运行良好。
SQL 版本:
Microsoft SQL Server 2016 (SP2-GDR) (KB4532097) - 13.0.5102.14 (X64) 2019 年 12 月 31 日 22:39:35 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2016 Standard 上基于内核的许可(64 位) 10.0(内部版本 14393:)(管理程序)
有人知道我在哪里可以找到权限错误吗?或者我可以使用哪些步骤来缩小范围?
虽然 MS 发布了一个补丁(不确定是否会这样做),但这是一个快速修复:
获取并保存此程序的源代码
[distribution].[sys].[sp_MSdetect_nonlogged_shutdown]
编辑源代码并找到变量@message,将其长度更改为4000。然后在临时表#JobHistory 中找到列message 并执行相同操作
在管理模式下从 CMD 以单一模式启动 SQL Server
path_to_binary\sqlservr.exe -m"SQLCMD"
打开另一个控制台窗口并启动 sqlcmd 以连接到实例
sqlcmd -S . -U sa -P
将目录置于读写状态
USE mssqlsystemresource
GO
alter database mssqlsystemresource set read_write
GO
粘贴修改后的代码。
将目录恢复为只读模式
alter database mssqlsystemresource set read_only
GO
关闭单模式实例
SHUTDOWN
GO
照常使用服务控制台启动实例