Процесс слияния не смог обновить список подписок - PullRequest
0 голосов
/ 31 августа 2009

У меня настроена репликация между экземпляром sql-server 2005 и несколькими экземплярами sql-server 2000. Репликация будет успешно выполняться некоторое время, прежде чем я получу следующее сообщение об ошибке:

Нарушение ограничения UNIQUE KEY 'unique_pubsrvdb'. Невозможно вставить повторяющийся ключ в объект «dbo.sysmergesubscription». (Источник: MSSQLSERVER, номер ошибки: 2627)

Когда я проверял sysmergesubscription, были дополнительные записи, которые, похоже, поступили из экземпляров 2000 года.

Мой вопрос: кто-нибудь сталкивался с этой проблемой и как вы с ней справились (без перестройки всей вещи)

Ответы [ 2 ]

1 голос
/ 19 сентября 2012

В моем случае обработка нескольких подписок и просто пришлось адаптировать для удаления подписок, которые были проблемы с:

delete
from sysmergesubscriptions
where pubid not in (select pubid from sysmergepublications)
and subscriber_server = 'SUBSCRIPTIONSERVER'
1 голос
/ 11 сентября 2009

Проблема заключалась в том, что у одного из подписчиков были старые публикации и подписки в системных таблицах, которые были реплицированы по всей системе. Что вызвало нарушение ограничения UNIQUE KEY.

Как только мы удалили эти старые объекты, мы смогли перезапустить репликацию.

Нам удалось идентифицировать действительные записи в sysmergepublication, потому что мы знали состояние этой таблицы до того, как недопустимые записи были реплицированы. В этом сообщении на форуме показано, как найти недействительные публикации, если вам нужно.

Мы использовали следующий 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>' для полного удаления репликации из базы данных. Эта команда выводит все триггеры репликации из базы данных.

...