gifts2017

Исправление ошибки в РИБ (некорректные данные в базе)

Опубликовал Pavel Korolev (Korolev) в раздел Администрирование - Распределенная БД (УРИБ, УРБД)

Если у вас выгрузились в одну из периферийных баз данные из другой – эта инструкция для вас. :)
Пример из реальной практики.

Рассмотрим на примере сети ресторанов, в которой есть центральная («ЦЕНТР») и 2 периферийные базы («БАНКЕТНЫЙ ЗАЛ» и «ОБЩЕСТВЕННАЯ СТОЛОВАЯ»). В базе «ЦЕНТР» хранятся два вида меню «Столовая» и «Банкетное», а также указывается привязка вида меню к конкретной базе.

В базу «БАНКЕТНЫЙ ЗАЛ» попали данные из меню «Столовая», хотя дял нее установлено только меню «Банкетное».

Преварительно, конечно же, делаем копии баз! :)

А теперь по пунктам:

  1. В базе «ЦЕНТР» помечаются на удаление все элементы и папки меню «Банкетное».
  2. Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ»
  3. В базе «БАНКЕТНЫЙ ЗАЛ» производится обмен с базой «ЦЕНТР».
  4. После пункта №3 в базе «БАНКЕТНЫЙ ЗАЛ» у нас стали помеченными на удаление элементы, которые действительно должны быть в этой базе. Соответственно, объекты которые не должны быть в базе у нас без пометками удаления, поэтому пишем обработку, которая помечает на удаление эти объекты.
  5. Запускаем обработку в базе «БАНКЕТНЫЙ ЗАЛ», таким образом все объекты у нас с пометкой на удаление. ВНИМАНИЕ! Обмен с базой «ЦЕНТР» на этом этапе не делается.
  6. В базе «ЦЕНТР» снимаем пометку удаления с объектов, которую установили в пункте №1.
  7. Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ»
  8. В базе «БАНКЕТНЫЙ ЗАЛ» производится обмен с базой «ЦЕНТР».
  9. После пункта №8 в базе «БАНКЕТНЫЙ ЗАЛ» помечены на удаление только не нужные элементы в этой базе. Запускаем стандартную обработку «Удаление помеченных объектов» и с помощью этой обработки удаляем объекты.
  10. Возможно, что после пункта №9, в базе эти объекты не удалятся, т.к. по ним уже были какие-то операции. Здесь уже нужно думать в зависимости от ситуации, если она позволяет, то можно просто оставить эти объекты помеченными на удаление.
  11. Запускаем типовую обработку РегистрацияИзмененийДляОбмена.epf
  12. Выбираем узел обмена «ЦЕНТР»
  13. У нас появится список элементов, которые были изменены базе («БАНКЕТНЫЙ ЗАЛ») и должны быть выгружены в «ЦЕНТР». Нам это не нужно на текущем шаге, поэтому мы нажимаем кнопку «Удалить всю регистрацию», выбираем пункт «Для всех элементов», нажимаем «ОК» и подтверждаем удаление.
  14. После пункта №13 у нас была изменена регистрация наших изменений, поэтому делаем обмен из базы «БАНКЕТНЫЙ ЗАЛ» с базой «ЦЕНТР»
  15. Из базы «ЦЕНТР» производится обмен с базой «БАНКЕТНЫЙ ЗАЛ».

Далее необходимо проверить полученный результат, сделать обмены между базами «ЦЕНТР» и «ОБЩЕСТВЕННАЯ СТОЛОВАЯ» (в этой базе ничего не должно пропасть). Сделать еще несколько обменов между базами «ЦЕНТР» - «БАНКЕТНЫЙ ЗАЛ» и «ЦЕНТР» - «ОБЩЕСТВЕННАЯ СТОЛОВАЯ», убедиться, что все нормально.


P.S. Стоит заметить, что данный способ решения имеет свой минус. В случае, когда в базе «ЦЕНТР» есть помеченные на удаления объекты из меню «Банкетное», то по завершению операции эти объекты останутся без пометки. Поэтому необходимо проконтролировать этот момент. Но в любом случае, это уже не настолько критично по сравнению с “левыми” данными.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Космачев (ksnik) 27.09.12 01:35
Я не понял, для чего нужно выполнять 1 пункт Вашей инструкции. Без него восстановление не работает?
Может быть в качестве защиты от описанных Вами сбоев сгодится метод:
Редактируем таблицу в новой периферийной базе 1SDBSET, удаляем в ней все строчки кроме строчки данной периферийной ПБ и центральной ЦБ базы. В оставшихся двух строчках меняем статусы, в колонке DBSTATUS переназываем, меняем местами значения полей M и P. В таблице _1SDBSET есть поле DBSTATUS, оно может принимать следующие значения: P - Центральная M - Текущая N - Периферийная (непроинициирована) C - Периферийная.
из публикации http://infostart.ru/public/153668/
?
2. Pavel Korolev (Korolev) 27.09.12 09:26
(1) ksnik, я этот делал для того, чтобы определить какие действительно данные должны быть в периферийной базе.
Представьте, в базе "Банкет" есть 2 элемента - 1 действительно должен быть в базе, другой нет. Оба они не помечены на удаление. Как определить какой элемент должен быть? Я пошел вот таким способом. При пометке на удаление в центральной и после обмена с Банкетом получаю, что в базе Банкета помечены на удаление те элементы, которые действительно должны быть в этой базе.

Благодарю Вас за метод, посмотрю на досуге :)
3. Сергей Космачев (ksnik) 27.09.12 12:30
(2) Korolev, а инвертирование пометки на удаление на 4 шаге не поможет?
Я предложил свой метод потому что подумал, что может быть настройка таблиц УРБД может исправить корень проблемы, чтоб данные из одной периферийной базы не могли попасть в другую.
4. Андрей Казанцев (ander_) 03.10.12 08:03
(3) ksnik, а разве редактирование таблиц отвечающих за УРБД в 7.7 помогает в 8.х? :)
5. Сергей Космачев (ksnik) 03.10.12 08:11
(4) ander_, нет, не помогают, это я проглядел.
6. Трактор Трактор (Трактор) 11.10.12 16:31
Плюс за понимание схемы движений объектов в распределённой базе. Описана хорошая метода.
7. Андрей Киреев (FractonKireyev) 11.10.12 19:39
Хорошая методика. Советую взять на вооружение всем, кто работает с РИБ.
8. Dimon (klel) 11.10.12 20:43
9. Pavel Korolev (Korolev) 11.10.12 22:04
Ды не за что :) Хорошо будет, если это Вам поможет. :)
10. Антон Тоник (artichoke) 14.10.12 14:35
"Если у вас выгрузились в одну из периферийных баз данные из другой – эта инструкция для вас"
Цель какая у всего этого действа? Удалить неверно отправленные данные, предотвратить неправильную отправку или будет изложен алгоритм корректного обмена между такими базами - похоже осознать цель предлагается, дочитав статью до конца!? Это такой маркетинговый ход? :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа