При распределённой БД

Теоретическая часть

Для лучшего понимания возможных проблем рассмотрим часть структуры распределённой сети БД.

 

Имеем три базы данных:

  • Центральная БД. В ней собираются данные из всех магазинов компании
  • БД магазина. С этой БД работают сотрудники магазина
  • БД автономной кассы. 

Данные вводятся в трёх местах и потом собираются в ЦБД. Для того чтобы данные не затирали друг друга, применятся механизм уникальной нумерации записей. Каждой записи в месте её создания присваивается уникальный код.

Код содержит:

  • сегмент нумерации. Сегмент - это уникальный номер базы в распределённой сети. Сегмент позволяет различать записи по месту её создания. В приведенном примере  все записи, созданные в БД магазина, будут иметь сегмент равный 1. Когда эти записи появятся в ЦБД, то их можно будет выделить по значению сегмента. 

Сегмент назначается при создании БД и не изменяется.

  • UID.  Уникальный номер в пределах той БД, где запись создаётся. 

UID назначается при создании записи. Применяется последовательная нумерация - к последнему использованному номеру добавляется 1. Значения для нумерации хранятся в специальной таблице нумераторов.

Таким образом, при штатной работе гарантируется, что каждая запись имеет уникальный номер.

При устранении последствий аварии часто требуется восстановить БД из архива. Чтобы предотвратить нарушение целостности БД из-за появления неуникальных UID-ов следует выполнить ряд действий. Итоговый набор этих действий зависит от величины поломки. Стандартная последовательность будет приведена ниже.

Основные причины нарушения целостности

Разберём на примере поломки БД магазина.

  • Не остановлены обмены с другими программами и БД.
    Пример 1: Работает exchange-egais. Он продолжает посылать информацию об изменении статусов документов ЕГАИС. 
    Пример 2: Не остановлен обмен с кассами. Кассы отправляют ККЛ в магазин. 
  • Разрешили работу пользователей или включили обмены до передачи из ЦБД документов, которые были созданы в магазине за период с момента снятия архива до момента восстановления базы из архива. 

Этапы восстановления БД

  1. Остановить все процессы обмена данными с восстанавливаемой базой. В том числе, exchange-egais и обмен с кассами.
  2. Восстановить базу магазина из архива.
  3. Передать из ЦБД данные, которые имеются в ЦБД и отсутствуют в архиве базы магазина
    1. Запустить в магазине отчёт:
      Системный администратор Домино/ Восстановление БД после аварии/ Статистика по UID объектов
    2. Записать из раздела "Общая статистика" этого отчёта сегмент и значения нумераторов (индексов) для Пользователей, Кодификаторов, Агентов, Продуктов и Документов
    3. Запустить этот же отчёт в ЦБД
    4. Найти в разделе Статистика по объектам нужный сегмент и сравнить значения колонки Макс.Индекс.
    5. Если в ЦБД значение больше, то следует запустить процедуру: Системный администратор Домино/ Восстановление БД после аварии/  Выгрузка объектов по сегменту БД (в файл \domino8\mail\Objects*.Dat). Указать сегмент и значения, записанные в магазине. (Значения можно указать с запасом).
    6. Найти файл ObjectList_Seg_nnnn.dat в каталоге mail, сделать и сохранить копию файла в другом каталоге. (На случай, если придётся повторить процедуру.)
    7. Загрузить файл в БД магазина.
  4. Передать из БД кассы данные, которые отсутствуют в архиве базы магазина. Выполняется аналогично пункту 3, только вместо ЦБД взять базу той кассы, которая работала в момент аварии.
      1. Запустить этот отчёт в БД кассы
      2. Найти в разделе Статистика по объектам нужный сегмент и сравнить значения колонки Макс.Индекс.
      3. Если в БД кассы значение больше, то следует запустить процедуру "Выгрузка объектов по сегменту БД". Указать сегмент и значения, записанные в магазине.
      4. Найти файл ObjectList_Seg_nnnn.dat в каталоге mail, сделать и сохранить копию файла в другом каталоге. (На случай, если придётся повторить процедуру.)
      5. Загрузить файл в БД магазина.
  5. Теперь можно запустить все процессы обмена и подключать пользователей.
  6. Проверить в БД магазина наличие документов с момента снятия дампа. Большинство документов восстановится при загрузке файла из ЦБД в БД магазина при условии, что почтовый обмен работал вплоть до падения БД магазина. 
  7. Недостающие документы ввести вручную. 
  8. Повторно выгрузить ККЛ с касс за аварийный период и сформировать реализацию.
  9. Выполнить выверку остатков и финансовых отчётов.
Что делать с документами в Retail-Alco, которые уже подтверждены в ЕГАИС, но не дошли до ЦБД?

С каждым документом придется разбираться отдельно.

Сначала составляется реестр проблемных документов. Сравните данные в ЛК ЕГАИС и Домино. 
В реестре обязательно должны быть ЕГАИС- идентификаторы документов. Для приходов - статусы (полностью/частично/отклонён). И контрольные цифры по общему числу строк и единиц товара.

Далее по этому списку ищете документы в архиве Exchange-EGAIS, выбираете эти документы и подкладываете в папку входящих.

Архив находится в папках Exchange-EGAIS\LOG\Files\дата.

Положить в папку Exchange-EGAIS\Repeat

Exchange-egais обработает файлы и создаст по ним приходы в Retail-alco. По созданным приходам следует сформировать приходы в Retail-Store.

Если документ в ЕГАИС уже проведён и товары находятся на балансе в ЕГАИС, то перед акцептом связанного документа в Retail-Store следует отвязать этот приход в Store от документа ЕГАИС. 

Ошибка: Нарушена уникальность

Необходимо найти место и решить, как исправить ошибку менее затратным способом.

Например, нашли строку с проблемным UID. В разных базах она принадлежит разным документам. Какой-то из документов или строку надо удалить и создать заново.