Пример из реальной практики.
Рассмотрим на примере сети ресторанов, в которой есть центральная («ЦЕНТР») и 2 периферийные базы («БАНКЕТНЫЙ ЗАЛ» и «ОБЩЕСТВЕННАЯ СТОЛОВАЯ»). В базе «ЦЕНТР» хранятся два вида меню «Столовая» и «Банкетное», а также указывается привязка вида меню к конкретной базе.
В базу «БАНКЕТНЫЙ ЗАЛ» попали данные из меню «Столовая», хотя дял нее установлено только меню «Банкетное».
Преварительно, конечно же, делаем копии баз! 🙂
А теперь по пунктам:
- В базе «ЦЕНТР» помечаются на удаление все элементы и папки меню «Банкетное».
- Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ»
- В базе «БАНКЕТНЫЙ ЗАЛ» производится обмен с базой «ЦЕНТР».
- После пункта №3 в базе «БАНКЕТНЫЙ ЗАЛ» у нас стали помеченными на удаление элементы, которые действительно должны быть в этой базе. Соответственно, объекты которые не должны быть в базе у нас без пометками удаления, поэтому пишем обработку, которая помечает на удаление эти объекты.
- Запускаем обработку в базе «БАНКЕТНЫЙ ЗАЛ», таким образом все объекты у нас с пометкой на удаление. ВНИМАНИЕ! Обмен с базой «ЦЕНТР» на этом этапе не делается.
- В базе «ЦЕНТР» снимаем пометку удаления с объектов, которую установили в пункте №1.
- Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ»
- В базе «БАНКЕТНЫЙ ЗАЛ» производится обмен с базой «ЦЕНТР».
- После пункта №8 в базе «БАНКЕТНЫЙ ЗАЛ» помечены на удаление только не нужные элементы в этой базе. Запускаем стандартную обработку «Удаление помеченных объектов» и с помощью этой обработки удаляем объекты.
- Возможно, что после пункта №9, в базе эти объекты не удалятся, т.к. по ним уже были какие-то операции. Здесь уже нужно думать в зависимости от ситуации, если она позволяет, то можно просто оставить эти объекты помеченными на удаление.
- Запускаем типовую обработку РегистрацияИзмененийДляОбмена.epf
- Выбираем узел обмена «ЦЕНТР»
- У нас появится список элементов, которые были изменены базе («БАНКЕТНЫЙ ЗАЛ») и должны быть выгружены в «ЦЕНТР». Нам это не нужно на текущем шаге, поэтому мы нажимаем кнопку «Удалить всю регистрацию», выбираем пункт «Для всех элементов», нажимаем «ОК» и подтверждаем удаление.
- После пункта №13 у нас была изменена регистрация наших изменений, поэтому делаем обмен из базы «БАНКЕТНЫЙ ЗАЛ» с базой «ЦЕНТР»
- Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ».
Далее необходимо проверить полученный результат, сделать обмены между базами «ЦЕНТР» и «ОБЩЕСТВЕННАЯ СТОЛОВАЯ» (в этой базе ничего не должно пропасть). Сделать еще несколько обменов между базами «ЦЕНТР» — «БАНКЕТНЫЙ ЗАЛ» и «ЦЕНТР» — «ОБЩЕСТВЕННАЯ СТОЛОВАЯ», убедиться, что все нормально.
P.S. Стоит заметить, что данный способ решения имеет свой минус. В случае, когда в базе «ЦЕНТР» есть помеченные на удаления объекты из меню «Банкетное», то по завершению операции эти объекты останутся без пометки. Поэтому необходимо проконтролировать этот момент. Но в любом случае, это уже не настолько критично по сравнению с “левыми” данными.
Я не понял, для чего нужно выполнять 1 пункт Вашей инструкции. Без него восстановление не работает?
http://infostart.ru/public/153668/
Может быть в качестве защиты от описанных Вами сбоев сгодится метод:
Редактируем таблицу в новой периферийной базе 1SDBSET, удаляем в ней все строчки кроме строчки данной периферийной ПБ и центральной ЦБ базы. В оставшихся двух строчках меняем статусы, в колонке DBSTATUS переназываем, меняем местами значения полей M и P. В таблице _1SDBSET есть поле DBSTATUS, оно может принимать следующие значения: P — Центральная M — Текущая N — Периферийная (непроинициирована) C — Периферийная.
из публикации
?
(1) ksnik, я этот делал для того, чтобы определить какие действительно данные должны быть в периферийной базе.
Представьте, в базе «Банкет» есть 2 элемента — 1 действительно должен быть в базе, другой нет. Оба они не помечены на удаление. Как определить какой элемент должен быть? Я пошел вот таким способом. При пометке на удаление в центральной и после обмена с Банкетом получаю, что в базе Банкета помечены на удаление те элементы, которые действительно должны быть в этой базе.
Благодарю Вас за метод, посмотрю на досуге 🙂
(2) а инвертирование пометки на удаление на 4 шаге не поможет?
Я предложил свой метод потому что подумал, что может быть настройка таблиц УРБД может исправить корень проблемы, чтоб данные из одной периферийной базы не могли попасть в другую.
(3) ksnik, а разве редактирование таблиц отвечающих за УРБД в 7.7 помогает в 8.х? 🙂
(4) ander_, нет, не помогают, это я проглядел.
Плюс за понимание схемы движений объектов в распределённой базе. Описана хорошая метода.
Хорошая методика. Советую взять на вооружение всем, кто работает с РИБ.
Спасибо за методику =) ++
Ды не за что 🙂 Хорошо будет, если это Вам поможет. 🙂
«Если у вас выгрузились в одну из периферийных баз данные из другой – эта инструкция для вас»
Цель какая у всего этого действа? Удалить неверно отправленные данные, предотвратить неправильную отправку или будет изложен алгоритм корректного обмена между такими базами — похоже осознать цель предлагается, дочитав статью до конца!? Это такой маркетинговый ход? 🙂