代码之家  ›  专栏  ›  技术社区  ›  jeremcc chris

SQL复制“找不到行”错误

  •  10
  • jeremcc chris  · 技术社区  · 17 年前

    SQL Server向我显示以下消息:

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

    我四处寻找,试图找出是什么表,甚至是什么记录导致了这个问题,但我在任何地方都找不到这些信息。

    到目前为止,我发现的最详细的数据是:

    交易序列号:0x0003BB0E0000001DF000600000000,命令ID:1

    8 回复  |  直到 17 年前
        1
  •  11
  •   brazilianldsjaguar    12 年前

    use distribution
    go
    
    select * from dbo.MSarticles
    where article_id in (
        select article_id from MSrepl_commands
        where xact_seqno = 0x0003BB0E000001DF000600000000)
    

    这将为您提供命令(以及执行命令所针对的主键(即行))

    exec sp_browsereplcmds 
    @xact_seqno_start = '0x0003BB0E000001DF000600000000', 
    @xact_seqno_end = '0x0003BB0E000001DF000600000000'
    
        2
  •  9
  •   jeremcc chris    17 年前

    很遗憾,我无法通过SQL Server复制接口(或事件日志)找出是哪个表导致了问题。它只是没有说。

    请记住,为了实现这一点,在您对订阅者数据库进行差异化和修复的过程中,您的发布数据库需要保持“安静”。幸运的是,在这种情况下,我有这种奢侈。

        3
  •  3
  •   Mitch Wheat    17 年前

    如果您的数据库不是太大,我会停止复制,重新快照,然后重新启动复制。这 technet article 描述了步骤。

    如果由于用户意外更改了副本上的数据而导致它不同步,我会设置必要的权限来防止这种情况。

    replication article

        4
  •  1
  •   KShan    13 年前

    USE [distribution]
    
    select * from dbo . MSarticles 
    where article_id IN ( SELECT Article_id from MSrepl_commands 
    where xact_seqno = 0x0003BB0E000001DF000600000000)
    
        5
  •  0
  •   Tristan Tristan    17 年前

    当然,如果您在复制失败时检查错误,它还会告诉您哪个记录有问题,您可以从核心系统中提取数据,然后将其插入订阅服务器。

    这比跳过错误要好,因为SQL数据比较会锁定表进行比较,如果你有数百万行,这可能需要很长时间才能运行。

        6
  •  0
  •   bfavaretto    13 年前

        7
  •  0
  •   Iman    12 年前

    以下检查解决了我的问题

    • 检查所有复制SQL代理作业是否正常工作,如果没有,则启动它们。
      • 在我的例子中,它被停止是因为几个小时前某个DBA因为阻塞问题而发生了一些终止会话
    • 在很短的时间内,订阅中的所有数据都已更新,没有 复制监视器中的其他错误
    • 就我而言,上述所有查询都没有返回任何结果
        8
  •  0
  •   MJH    9 年前

    当订阅服务器上不存在特定记录,并且对主服务器上的同一记录执行更新或删除命令,并且该命令也在订阅服务器上复制时,通常会出现此错误。

    由于订阅服务器上不存在此记录,复制会抛出错误“找不到行”

    解决此错误以使复制工作恢复到正常运行状态:

    USE [distribution]
    
    SELECT *
    FROM   msrepl_commands 
    WHERE  publisher_database_id = 1
           AND command_id = 1
           AND xact_seqno = 0x00099979000038D6000100000000
    

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

    DELETE FROM msrepl_commands
    WHERE  publisher_database_id = 1
           AND command_id =1
           AND xact_seqno = 0x00099979000038D6000100000000 
    
    1. 如果是更新声明:

    您需要手动将该记录从发布者数据库插入到订阅者数据库: