suther
宁静以致远

查看复制监视器/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

 

具体的定义可以在subscriber的订阅库中查看

 

use[subDBName]exec sp_helptext [sp_MSdel_dbota]

 

解决方式是将删除的行在订阅中重新插入,主键就是sp_MSdel_dbota里的参数。

 

posted on 2012-09-20 10:41  suther  阅读(2169)  评论(0编辑  收藏  举报