【问题标题】:SQL Replication error - row was not found at the SubscriberSQL 复制错误 - 在订阅服务器上找不到行
【发布时间】:2011-08-04 02:43:28
【问题描述】:

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

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

然后我们向源数据库添加一个新行,然后砰!错误。

尝试的命令: 如果 @@trancount > 0 回滚 tran (交易序号:0x000004BE00000558000100000000,命令ID:1) 错误信息: 应用复制命令时,在订阅服务器上未找到该行。 (来源:MSSQLServer,错误号:20598)

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

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

我们可以从哪里开始寻找任何想法?

【问题讨论】:

    标签: sql sql-server replication


    【解决方案1】:

    呃……这个错误很糟糕。当您说您插入了一行时,我假设您在发布者处插入了它。那是行不通的;复制以串行方式传递命令。也就是说,它不会复制您插入缺失行的事实,直到它超过您当前的错误。

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

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

    【讨论】:

      【解决方案2】:

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

      最后我们尝试像 RCA 一样

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

      在我们的案例中执行清除数据后问题就消失了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-22
        • 2013-02-08
        • 2017-12-11
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        相关资源
        最近更新 更多