SQL Replication错误 - 在订阅服务器上找不到行

时间:2011-08-04 02:43:29

标签: sql sql-server replication

我们正在尝试在SQL Server 2005数据库上设置复制。过去一年我们遵循了一些指示,一切都很好。最近,它开始失败(开发环境,所以每周我们重建数据库..并应用replciation)。

我们遵循一系列步骤,生成快照以及应用于复制数据库。一切都很好。没有错误。

然后我们在源数据库中添加一个新行,然后爆炸!错误。

尝试的命令: if @@ trancount> 0 rollback tran (事务序列号:0x000004BE00000558000100000000,命令ID:1) 错误消息: 应用复制命令时,在订阅服务器上找不到该行。 (来源:MSSQLServer,错误号:20598)

我们正在插入一行,但它抱怨该行不在订阅者身上。不过这是对的。我们希望它将插入复制到订阅者......

当我们在源和目标上都执行SELECT COUNT(*)时,行计数是相同的,直到我们执行INSERT,此时,源包含,但目标保持不变...

我们可以开始寻找任何想法吗?

2 个答案:

答案 0 :(得分:1)

呃......这个错误很糟糕。当您说您插入了一行时,我假设您已将其插入发布者。那不行;复制按顺序传递命令。也就是说,它不会复制您插入缺失行直到超过当前错误的事实。

所以,这是我们开始的地方。在错误消息中,我们看到了一个事务序列号。我们可以使用它来确定缺失行的主键。在分发服务器上,有一个名为sp_browsereplcmds的存储过程。您可以为@xact_seqno_start和@xact_seqno_end参数插入事务序列号。您还将在存储过程中看到command_id参数;这对应于错误消息中的命令ID。尝试仅使用指定的参数执行该过程。它应该为您提供它尝试在订阅者处执行的命令。从那里,您可以告诉它要么尝试更新或删除的行的主键。然后,您可以在订户处插入具有该主键的行,并且复制将继续进行。

或者,您可以从此订阅者中删除此文章,重新添加该文章,然后重新初始化该文章。它在服务器上更加强烈,但不那么繁琐。

答案 1 :(得分:0)

这是由于发布者数据库上的数据损坏,我们遇到了相同的复制错误,当我们运行DBCC检查数据库时允许数据丢失。

最后我们尝试做RCA,如

1。)通过在离线模式下执行CHKDSK来检查存储错误 2.)如果有大量数据,则清除表格。在我们的例子中,我们有4000万行。

在我们的案例中清除数据后问题已经消失