SQL Server:复制错误 - 应用复制命令时,在订阅服务器上找不到该行

时间:2014-02-13 20:44:34

标签: sql sql-server sql-server-2008

我在Activity Monitor中收到以下错误,

  

应用复制命令时,在订阅服务器上找不到该行。 (来源:SQL Server,错误号:20598)

经过一番研究后,我发现错误的发生是因为它试图删除订阅者中不存在的记录(发布者中也不存在)

{CALL [dbo].[sp_MSdel_testtable] (241)}

我可以手动将某些内容插入到记录中,复制将继续进行。我现在遇到的问题是我没有多少糟糕的记录。有没有快速的方法来做到这一点?我已经花了好几个小时,插入了大约20条记录。

谢谢

3 个答案:

答案 0 :(得分:1)

通过SSMS中的复制监视器重新初始化订阅,并在重新初始化期间生成新快照。这应该清除缺失的记录问题。

答案 1 :(得分:0)

老兄,我[字面意思]刚刚在几分钟前解决了这个问题。它让我在疯狂的情况下乘坐出租车只需五十美分。复制的数据库是卸载应用程序报告的第三方解决方案的一部分。事实证明,他们的一个应用服务器指向我们的报告数据库而不是实时数据库。因此,"在订户处找不到行。"因为他们在订户表中插入和删除记录。

使用distribution.dbo.sp_helpsubscriptionerrors查找xact_seqno,然后您可以使用distribution.dbo.browsereplcmds和此查询

SELECT * 
   FROM distribution.dbo.MSarticles
   WHERE article_id in (
      SELECT article_id 
         FROM MSrepl_commands
         WHERE xact_seqno = 0x xact_seqno)

获取更多信息。如果您希望获得单笔交易,请使用distribution.dbo.sp_setsubscriptionxactseqno"取消卡住"或者只是重新初始化。

我最终在发布者和订阅者上运行SQL事件探查器,然后键入我在上面的查询中找到的表。那是我在复制表上发现DML的时候。

祝你好运。

答案 2 :(得分:0)

此查询将为您提供该文章的所有待处理命令,这些命令需要从分发者发送到订阅者。

在这里,您将获得具有相同xact_seqno_start和xact_seqno_end但具有不同命令ID的多个记录。

您可以检查是否所有都是删除命令,您可以获取所有的主键列值并将其手动插入订阅服务器。

EXEC Sp_browsereplcmds
  @article_id = 813,
  @command_id = 1,
  @xact_seqno_start = '0x00099979000038D60001',
  @xact_seqno_end = '0x00099979000038D60001',
  @publisher_database_id = 1