Error number: 20598 The row was not found at the Subscriber when applying the replicated command.

今天测试Replication遇到下面的错误:

 

The row was not found at the Subscriber when applying the replicatedcommand.(Source: MSSQLServer, Error number: 20598)

if @@trancount > 0 rollback tran
(Transaction sequence number: 0x0000004100000162000400000000, Command ID: 1)

 

这个错误说明了当发布服务器上执行的语句在订阅服务器上执行时无法在订阅服务器找到对应的数据,所以出错。在默认情况下,发布代理遇到错误时就会停止,所以后影响后面的发布执行。

 

解决这个问题的根本原因首先要查出那些数据不同步,可以使用DATADIFF工具验证两边数据,然后同步数据(或者重新初始化)。

 

查询是哪个Article出了问题可以使用下面的语句:


USE [distribution]

 

select * from dbo . MSarticles

where article_idIN(SELECT Article_idfrom MSrepl_commands

where xact_seqno= 0x0000004100000162000400000000)

 

结果如下(这个例子test表数据有问题):

 

 

 

但是发现那些数据不同步可能会花比较长的时间,为了能够让发布尽快同步,我们可以跳过事务复制中的错误。对于事务复制,有两种方法可以跳过在分发过程中遇到的错误:

·        分发代理的-SkipErrors参数,可用来跳过某种类型的错误。有错误的事务将不提交,但后续的事务将提交。

·        sp_setsubscriptionxactseqno存储过程,可用来跳过一个或多个导致错误的事务。非SQL Server的订阅服务器没有此选项。

使用-SkipErrors参数,可以让代理将错误记录下来,而Agent继续运行。通常的做法是在DistributionAgent profile中使用“Continue On Data ConsistencyErrors”。如图:

 

 

注意:代理参数更改将在下次启动代理时生效。如果代理连续运行,您必须停止并重新启动代理。

 

更多详细信息参考:SkippingErrors in Transactional Replicationhttp://technet.microsoft.com/en-us/library/ms151331(v=sql.105).aspx

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我的代码中缺少了logCallback函数的声明,导致编译时出现了该错误。请将以下代码添加到main函数前面,即可解决该问题: ```c++ void logCallback(const rosgraph_msgs::Log::ConstPtr& log); ``` 完整的C++代码示例如下: ```c++ #include <ros/ros.h> #include <ros/console.h> #include <rosgraph_msgs/Log.h> void logCallback(const rosgraph_msgs::Log::ConstPtr& log); int main(int argc, char **argv) { ros::init(argc, argv, "log_listener"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/rosout", 1000, logCallback); ros::spin(); return 0; } void logCallback(const rosgraph_msgs::Log::ConstPtr& log) { // 解析日志信息 std::string log_msg = log->msg; std::string log_level = log->level; std::string log_file = log->file; std::string log_line = std::to_string(log->line); std::string log_time = std::to_string(log->header.stamp.toSec()); // 根据日志等级设置终端颜色 if (log_level == "INFO") { ROS_INFO_STREAM("\033[32m" << "[" << log_level << "]" << "[" << log_file << "-" << log_line << "]" << "[" << log_time << "]" << ": " << log_msg << "\033[0m"); } else if (log_level == "WARN") { ROS_WARN_STREAM("\033[33m" << "[" << log_level << "]" << "[" << log_file << "-" << log_line << "]" << "[" << log_time << "]" << ": " << log_msg << "\033[0m"); } else if (log_level == "ERROR") { ROS_ERROR_STREAM("\033[31m" << "[" << log_level << "]" << "[" << log_file << "-" << log_line << "]" << "[" << log_time << "]" << ": " << log_msg << "\033[0m"); } else if (log_level == "FATAL") { ROS_FATAL_STREAM("\033[35m" << "[" << log_level << "]" << "[" << log_file << "-" << log_line << "]" << "[" << log_time << "]" << ": " << log_msg << "\033[0m"); } } ``` 请注意,我还将log->line和log->header.stamp.toSec()转换为了字符串类型,以便与其他字符串拼接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值