Мы использовали репликацию слиянием в течение многих лет, а иногда (например, после обновления БД) она порвалась со странными ошибками, которые невозможно исправить, что бы мы ни пытались.Во всех этих случаях ЕДИНСТВЕННОЕ решение, которое работало, состояло в том, чтобы повторно инициализировать подписки или даже удалить и заново создать публикации со всеми подписками.
Но так как это случай репликации слиянием и новые данные добавляются на всех концах (т. Е. Издатель и все подписчики), когда синхронизация не происходит, мы не можем просто повторно инициировать подписки, потому что, как вы указали, не синхронизированыданные, созданные на стороне неисправного абонента, будут потеряныВаш случай еще сложнее, потому что вы используете шифрование и XML-файлы для хранения данных.Вы храните зашифрованный XML как BLOB / CLOB в БД?
Однако я предоставлю решение, которое работало для нас много раз.Таким образом, в случае сбоя одной или нескольких конечных точек репликации слиянием необходимо выполнить следующие шаги:
вручную добавить несинхронизированные данные во все конечные точки с помощью таких инструментов, как Red Gate SQL Data Compare (коммерческий с бесплатной 14-дневной пробной версией) или бесплатные Инструменты данных SQL Server (SSDT) от Microsoft.Инструмент красных ворот очень мощный.Вы можете определить собственные сопоставления таблиц / столбцов между базами данных для сравнения.В то время как SSDT от MS в настоящее время можно сравнивать только таблицы, имеющие одинаковые имена и одинаковые имена схем.Оба инструмента могут генерировать сценарии вставки / обновления / удаления, чтобы синхронизировать ваши данные.Они даже автоматически отключают, а затем восстанавливают проверки ограничений внешнего ключа.
Измените свою публикацию и установите для свойства Action if name is in use
значение Оставьте существующий объект неизменным для всех статей.
Повторная инициализация подписок.
После выполнения шага № 2 и повторного запуска агента репликации подписки все равно потребуется время для обработки существующих записей (и в зависимости отРазмер набора данных может занять некоторое время, поэтому подумайте о добавлении фильтров «Дата» в статьи), но это не изменит никаких данных, не произойдет ни удаления, ни вставки, если базы данных издателя и подписчика будут полностью синхронизированы после шага № 1.Агент будет отмечать только те существующие записи как обработанные, чтобы пропустить их во время будущих запусков, поэтому вы увидите только увеличение количества команд обновления в Мониторе репликации.После повторной инициализации подписки у вас все будет в порядке, и новые данные, сгенерированные с любой стороны, будут синхронизированы.
Ваш случай сложен, поскольку вы не можете легко выполнить ручную синхронизацию данных с шага № 1.Но это обязательное условие, и вам нужно подумать, как это сделать.Вы не предоставили подробную информацию о том, как на самом деле храните зашифрованные данные, поэтому я не могу предложить подробный план, но каким-то образом вам нужно вручную расшифровать существующие записи XML, вставить недостающие части, затем снова зашифровать и убедиться, что зашифрованные столбцы равны на всехсторон.
Надеюсь, это поможет вам решить вашу проблему.
PS.Я никак не связан ни с Red Gate, ни с Microsoft.