我在Activity Monitor中收到以下错误,
应用复制命令时,在订阅服务器上找不到该行。 (来源:SQL Server,错误号:20598)
经过一番研究后,我发现错误的发生是因为它试图删除订阅者中不存在的记录(发布者中也不存在)
{CALL [dbo].[sp_MSdel_testtable] (241)}
我可以手动将某些内容插入到记录中,复制将继续进行。我现在遇到的问题是我没有多少糟糕的记录。有没有快速的方法来做到这一点?我已经花了好几个小时,插入了大约20条记录。
谢谢
答案 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