查看复制监视器/dbo.MSrepl_errors
遇到如下错误:
尝试的命令:
if @@trancount > 0 rollback tran (事务序列号: 0x0000003A000001DB006800000000,命令 ID: 3)
错误消息:
· 应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598) 获取帮助: http://help/20598
· 应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598) 获取帮助: http://help/20598
出现这种错误的原始可能是:订阅服务器中的一个数据行A被(误)删除了,而发布服务器要修改/删除A这条记录,顺利删除后要将结果更新到订阅,此时订阅服务器中A已经不存在了…
可以在distributor上执行如下语句,获得具体错误信息
sp_browsereplcmds '0x0000003A000001DB006800000000','0x0000003A000001DB006800000000'
从上面的语句执行结果可以看出,一个删除100行数据的语句在发布库执行, 将相应的信息传递到分发后,分发库调用100次sp_MSdel_dbotx来完成数据的同步. 从之前的错误信息进一步看到,其中的第三条语句执行时到了问题:
分发代理在执行sp_MSdel_dbotx这条语句后出现了上述的错误。Sp_Msdel_dbotx这个存储过程的定义是在将对象添加到发布是定义的。默认的命名规则是sp_MS+operation+schemaName+tableName
可以通过下面这个查询定位到具体表
Use[distribution]
select*From MSarticles where article_id=@article_id
select*From MSarticles where article_id=@article_id
具体的定义可以在subscriber的订阅库中查看
use[subDBName]exec sp_helptext [sp_MSdel_dbota]
解决方式是将删除的行在订阅中重新插入,主键就是sp_MSdel_dbota里的参数。