我在活动监视器中收到以下错误,
应用复制命令时,在订阅服务器上找不到该行。 (来源:SQL Server,错误号:20598)
经过一番研究,我发现发生错误是因为它试图删除订阅者中不存在的记录(发布者中也不存在)
{CALL [dbo].[sp_MSdel_testtable] (241)}
我可以手动向记录中插入一些内容,复制就会继续。我现在遇到的问题是我不知道有多少不良记录。有什么快速的方法可以做到这一点吗?我已经花了几个小时插入了大约 20 条记录。
谢谢你
通过SSMS中的Replication Monitor重新初始化订阅,并在重新初始化期间生成新的快照。 这应该可以解决丢失记录的问题。
老兄,我[字面上]几分钟前刚刚解决了这个问题。 这让我花了大约五十美分的出租车费,差点就疯了。 复制的数据库是第三方解决方案的一部分,用于卸载其应用程序的报告。 事实证明,他们的应用程序服务器之一指向我们的报告数据库而不是实时数据库。 因此,“在订户处未找到行”。因为他们在订阅者表中插入和删除记录。
使用
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 Profiler,然后关闭我通过上面的查询找到的表。 就在那时,我在复制表上发现了 DML。
祝你好运。
此查询将为您提供该文章的所有待处理命令,这些命令需要从分发者发送到订阅者。
在这里,您将获得具有相同 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
有迹象表明这是网络延迟的原因。潜伏期约为10分钟、20分钟,甚至长达1小时。我通过在 AWS 端、vpc 和安全组端进行的调整消除了延迟,延迟降低到了几秒钟左右,问题就解决了。