Моя база подписчиков потеряла связь с издателем и просроченаМогут ли мои данные быть сохранены? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть база данных издателя A, и у меня есть две базы данных подписчиков B и C, которые подписываются на A. Мое приложение находится локально на сайтах B и C, и благодаря репликации изменения в B и / или C копируются друг в друга.

Проблема в том, что с 31 января 2019 года C прекратила подписку на A, и ИТ-специалисты на сайте C об этом не знали (оповещений нет).

Большая проблема заключается в том, что в это времялюди, использующие приложение в B, вводят данные, которые реплицируются обратно в A. В то же время люди на сайте C добавляют данные в базу данных C, которая не реплицировала обратно.

Если я восстановлю подписку, он возьмет данные в A и перезапишет C, что является серьезной проблемой, потому что я потеряю данные, добавленные в это время в C. Поскольку это данные о работоспособности, все они зашифрованы и хранятся в формате xml, и это не так просто, как простообновление данных, которые отсутствовали, потому что некоторые файлы совместно используются сайтами B и C, что означает, что они будут добавлять данныеa к сохраненному дереву xml.

Например, если кто-то видит пациента на сайте B и вводит заметку, он обновляет один файл.Но затем, если тот же пациент отправится на сайт C на следующей неделе, медсестра там обновит тот же файл, который был обновлен в B.

Я понятия не имею, как мне сначала синхронизировать обновления, сделанные в C, прежде чем восстанавливатьновая подписка.

Если у кого-либо есть какие-либо советы, которые будут высоко оценены, спасибо!

1 Ответ

2 голосов
/ 16 апреля 2019

Мы использовали репликацию слиянием в течение многих лет, а иногда (например, после обновления БД) она порвалась со странными ошибками, которые невозможно исправить, что бы мы ни пытались.Во всех этих случаях ЕДИНСТВЕННОЕ решение, которое работало, состояло в том, чтобы повторно инициализировать подписки или даже удалить и заново создать публикации со всеми подписками.

Но так как это случай репликации слиянием и новые данные добавляются на всех концах (т. Е. Издатель и все подписчики), когда синхронизация не происходит, мы не можем просто повторно инициировать подписки, потому что, как вы указали, не синхронизированыданные, созданные на стороне неисправного абонента, будут потеряныВаш случай еще сложнее, потому что вы используете шифрование и XML-файлы для хранения данных.Вы храните зашифрованный XML как BLOB / CLOB в БД?

Однако я предоставлю решение, которое работало для нас много раз.Таким образом, в случае сбоя одной или нескольких конечных точек репликации слиянием необходимо выполнить следующие шаги:

  1. вручную добавить несинхронизированные данные во все конечные точки с помощью таких инструментов, как Red Gate SQL Data Compare (коммерческий с бесплатной 14-дневной пробной версией) или бесплатные Инструменты данных SQL Server (SSDT) ​​от Microsoft.Инструмент красных ворот очень мощный.Вы можете определить собственные сопоставления таблиц / столбцов между базами данных для сравнения.В то время как SSDT от MS в настоящее время можно сравнивать только таблицы, имеющие одинаковые имена и одинаковые имена схем.Оба инструмента могут генерировать сценарии вставки / обновления / удаления, чтобы синхронизировать ваши данные.Они даже автоматически отключают, а затем восстанавливают проверки ограничений внешнего ключа.

  2. Измените свою публикацию и установите для свойства Action if name is in use значение Оставьте существующий объект неизменным для всех статей.

  3. Повторная инициализация подписок.

После выполнения шага № 2 и повторного запуска агента репликации подписки все равно потребуется время для обработки существующих записей (и в зависимости отРазмер набора данных может занять некоторое время, поэтому подумайте о добавлении фильтров «Дата» в статьи), но это не изменит никаких данных, не произойдет ни удаления, ни вставки, если базы данных издателя и подписчика будут полностью синхронизированы после шага № 1.Агент будет отмечать только те существующие записи как обработанные, чтобы пропустить их во время будущих запусков, поэтому вы увидите только увеличение количества команд обновления в Мониторе репликации.После повторной инициализации подписки у вас все будет в порядке, и новые данные, сгенерированные с любой стороны, будут синхронизированы.

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

Надеюсь, это поможет вам решить вашу проблему.

PS.Я никак не связан ни с Red Gate, ни с Microsoft.

...