You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL复制任务同步异常:无效列名及分发服务器安装错误求助

解决SQL Replication同步失败(列不存在+分发器未正确安装)的方案

这种情况我碰到过好几次,核心问题就是分发器的安装/配置不完整,或者SQL Server版本升级后复制元数据没同步更新,导致系统表缺失必要列,进而触发报错。下面是几个一步步的解决方案:

1. 重新配置分发器(最常用的修复手段)

首先得停掉所有相关的复制代理,避免操作冲突:

  • 打开SSMS,找到复制节点下的本地发布和本地订阅,右键对应的代理(快照、日志读取器、分发代理)选择「停止」;
  • 或者用T-SQL批量停止(替换成你的作业名):
    EXEC sp_stop_job @job_name = '你的快照代理作业名';
    EXEC sp_stop_job @job_name = '你的日志读取器代理作业名';
    EXEC sp_stop_job @job_name = '你的分发代理作业名';
    

接下来重新配置分发器:

  • 在分发服务器上,右键复制 -> 「分发器属性」,切换到「分发服务器」选项卡,检查分发数据库(默认是distribution)的状态;
  • 如果有报错提示,先选择「禁用分发」,然后右键复制 -> 「配置分发」,跟着向导重新完成分发器配置,确保每一步都没有报错(尤其是分发数据库的创建/权限配置)。

2. 手动添加缺失的系统列

报错里的deletebatchsize_xact和deletebatchsize_cmd是distribution数据库中MSdistribution_agents表的必要列,可能是安装时未创建或升级时丢失。直接在分发服务器上执行以下脚本修复:

USE distribution;
GO
-- 检查并添加deletebatchsize_xact列
IF NOT EXISTS (SELECT * FROM sys.columns WHERE name = 'deletebatchsize_xact' AND object_id = OBJECT_ID('MSdistribution_agents'))
BEGIN
    ALTER TABLE MSdistribution_agents ADD deletebatchsize_xact INT NULL DEFAULT 0;
END
-- 检查并添加deletebatchsize_cmd列
IF NOT EXISTS (SELECT * FROM sys.columns WHERE name = 'deletebatchsize_cmd' AND object_id = OBJECT_ID('MSdistribution_agents'))
BEGIN
    ALTER TABLE MSdistribution_agents ADD deletebatchsize_cmd INT NULL DEFAULT 0;
END
GO

执行完成后,重启所有复制代理,再通过「View Synchronization Status」检查同步状态。

3. 验证复制元数据一致性

有时候元数据不匹配也会导致这类问题,运行以下存储过程检查:

  • 在发布服务器上执行,验证发布元数据:
    EXEC sp_validatemergepublication @publication = '你的发布名称';
    
  • 在分发服务器上执行,验证分发器配置:
    EXEC sp_validatedistributor;
    

根据输出的提示信息,修复对应的元数据不一致问题。

4. 检查版本兼容性

确保发布服务器、分发服务器、订阅服务器的SQL Server版本是兼容的(比如高版本分发器可以兼容低版本发布/订阅,但反过来不行),版本差异过大也可能导致系统表结构不匹配。

内容的提问来源于stack exchange,提问作者ellickakudy rajeesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:45:20