SQL Server日志传送作业持sysadmin权限仍无法记录历史错误
日志传送复制作业sysadmin权限仍触发权限报错排查方案
你遇到的报错日志如下:
2021-08-22 21:00:00.86 Starting transaction log copy. Secondary ID: 'c29f....'
2021-08-22 21:00:00.87 Error: Could not log history/error message.(Microsoft.SqlServer.Management.LogShipping)
2021-08-22 21:00:00.87 Error: Only members of the sysadmin fixed server role can perform this operation.(.Net SqlClient Data Provider)
可按以下优先级排查原因:
- 核查作业运行账号与你校验的账号是否一致
多数场景下用户校验的是自己登录SSMS的个人账号,但日志传送作业的运行上下文由SQL Server代理配置决定,和登录账号无关:- 打开SQL Server代理节点,找到对应日志传送复制作业,右键依次点击【属性】-【步骤】,双击运行步骤,查看【运行身份】配置
- 如果运行身份为“SQL Server代理服务账号”,需要校验SQL Server代理服务的启动账号是否属于sysadmin角色
- 如果配置了代理账户(Proxy),需要校验代理凭证映射的Windows账号的权限
- 若配置了独立的日志传送监控实例,需确认作业运行账号同时在主实例、辅助实例、监控实例三个实例上都属于sysadmin角色
- 核查msdb系统表权限配置
报错提示无法写入历史/错误信息,日志传送的历史记录会写入msdb库的log_shipping_monitor_history_detail、log_shipping_monitor_error_detail系统表,权限异常会触发该报错:- 执行语句
SELECT name, suser_sname(owner_sid) FROM sys.databases WHERE name = 'msdb'确认msdb库所有者为合法sysadmin账号(通常为sa) - 执行语句
USE msdb; EXEC sp_helprotect @username = 'public', @objname = 'log_shipping_monitor_history_detail'确认public角色对该表有INSERT权限,日志传送作业默认通过public角色写入历史记录
- 执行语句
- 核查服务账号的特殊限制
- 如果SQL Server代理服务使用本地系统/网络服务账号,跨实例访问时会被识别为机器账号
域名\机器名$,需确认该机器账号在所有涉及的实例上都有sysadmin权限 - 域环境下需校验服务账号是否被组策略限制了权限继承、本地登录权限等
- 如果SQL Server代理服务使用本地系统/网络服务账号,跨实例访问时会被识别为机器账号
- 重置日志传送配置
以上核查都无异常的情况下,大概率是旧的日志传送配置元数据损坏,删除当前辅助节点的日志传送配置后重新搭建,即可解决残留配置导致的上下文异常问题。
内容的提问来源于stack exchange,提问作者Cataster
相关产品推荐
相关产品推荐

