2009-08-31 3 views
0

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

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

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

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

ответ

1

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

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

Мы смогли идентифицировать действительные записи в 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) 

Примечания: пример коды выше, предполагает что публикация sysmerge содержит только достоверные публикации

Альтернативно: Вы можете использовать EXEC sp_removedbreplication @dbname='<dbname>', чтобы полностью удалить репликацию из базы данных. Эта команда позволяет удалить все триггеры репликации из базы данных.

1

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

delete 
from sysmergesubscriptions 
where pubid not in (select pubid from sysmergepublications) 
and subscriber_server = 'SUBSCRIPTIONSERVER' 
Смежные вопросы