我在sql-server 2005实例和多个sql-server 2000实例之间建立了复制。在我收到以下错误消息之前,复制将成功一段时间:
违反UNIQUE KEY约束'unique_pubsrvdb'。无法在对象'dbo.sysmergesubscriptions'中插入重复键。 (来源:MSSQLSERVER,错误号:2627)
当我检查sysmergesubscriptions时,有额外的条目似乎来自2000个实例。
我的问题是有没有人遇到过这个问题,你是如何处理它的(没有重建整个事情)
答案 0 :(得分:1)
问题是其中一个订阅者在系统表中有旧的发布和订阅,这些发布和订阅在整个系统中被复制。这导致违反UNIQUE KEY约束。
一旦我们删除了这些旧的entires,我们就能够重新启动复制。
我们能够在sysmergepublication中识别有效记录,因为我们在复制无效条目之前知道了该表的状态。如果您需要,此forum post会向您展示如何定位无效的出版物。
我们使用以下sql检查其他订阅条目:
select *
from sysmergepublications
select *
from sysmergesubscriptions
where pubid in ( select pubid from sysmergepublications)
select *
from sysmergesubscriptions
where pubid not in ( select pubid from sysmergepublications)
以下是我们用于删除无效订阅的SQL:
delete from sysmergesubscriptions
where pubid not in ( select pubid from sysmergepublications)
注意:上面的代码示例假定sysmergepublication仅包含有效的出版物
另外:您可以使用EXEC sp_removedbreplication @dbname='<dbname>'
完全删除数据库中的复制。此命令似乎从数据库中删除所有复制触发器。
答案 1 :(得分:1)
在我处理多个订阅的情况下,只需要适应删除有问题的订阅:
delete
from sysmergesubscriptions
where pubid not in (select pubid from sysmergepublications)
and subscriber_server = 'SUBSCRIPTIONSERVER'