升级Distributor至2022后Log Reader调用sp_replcmds参数错误求助
问题原因分析
升级SQL Server分发服务器到2022版本后,日志读取器代理尝试向sp_replcmds传入额外的AG侦听器参数,但发布服务器端的sp_replcmds存储过程不支持该参数(多因发布服务器版本低于分发服务器,或复制元数据未同步更新),导致参数数量不匹配引发报错。
彻底解决方案
1. 对齐版本兼容性
若发布服务器为SQL Server 2017及更早版本,需将其升级至2019或2022版本。2022版分发服务器新增的@publisher_listener参数,需要对应版本的发布服务器端sp_replcmds提供支持。
2. 刷新复制系统对象与元数据
若发布服务器已为兼容版本(2019/2022),执行以下操作:
- 在发布服务器上运行:
该存储过程会将复制系统对象升级至当前服务器版本,确保EXEC sp_vupgrade_replication;sp_replcmds能正确处理新增参数。 - 在分发服务器上更新发布的连接配置,指定AG侦听器:
操作完成后重启日志读取器代理作业。EXEC sp_changepublication @publication = N'你的发布名称', @property = N'publisher', @value = N'AG_LISTENER_NAME';
3. 重建日志读取器代理
若上述操作无效,删除并重新创建日志读取器代理作业:
- 先禁用并删除当前的日志读取器代理作业。
- 在发布服务器上执行:
用AG侦听器名称作为发布服务器参数,确保代理生成正确的参数调用逻辑。EXEC sp_addlogreader_agent @publisher = N'AG_LISTENER_NAME', @publisher_db = N'你的发布数据库名', @job_login = N'域\代理账户', @job_password = N'代理账户密码';
4. 验证AG复制配置
- 确认AG所有节点均已完成复制配置,分发服务器具备各节点的连接权限。
- 检查AG侦听器可正常访问,日志读取器代理账户拥有连接AG侦听器及发布数据库的足够权限。
临时方案优化(无法立即升级发布服务器时)
保留发布服务器重定向为NULL的方案,同时配置AG故障转移触发脚本:
- 在AG故障转移时,自动执行
sp_changepublication更新分发服务器上的发布连接为新主节点名称,避免复制中断。 - 创建SQL Server代理作业,定时检查AG主节点状态,发生切换时自动更新发布服务器参数。
内容的提问来源于stack exchange,提问作者Mikhail Karatkevich
相关产品推荐
相关产品推荐

