Перенос данных на чистую базу (постановка)

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Перенос таблиц с дополнительной информацией)
Строка 1: Строка 1:
В данной постановке рассматривается альтернативное решение проблемы [[Полное закрытие периода (постановка)|полного закрытия периода]]. Вместо удаления данных за пределами активного периода предлагается перенести актуальную информацию в чистую БД согласно следующего алгоритма:
+
Принципы ускорения:
  
# Создаем чистую БД, только метаданные от исходной БД, используя ключ -m утилиты [[gbak]]. Присваиваем ей новый DBID.
+
# последовательное неиндексированное чтение исходных данных
# Запоминаем состояние и отключаем все триггеры.
+
# отключение индексов, триггеров, ключей, ограничений на конечной базе данных
# Удаляем все чеки.
+
# массивы идентификаторов для обработки в оперативной памяти
# Удаляем все ограничения (ПК, ФК).
+
# пересылка данных между базами внутри сервера
# Удаляем все индексы.
+
# Переносим данные.
+
# Восстанавливаем индексы и ограничения, подключаем тригеры и чеки.
+
  
=== Перенос данных ===
+
Примем:
  
Перед началом процесса пользователь может выбрать для каждого типа документов или справочников как переносить данные:
+
А -- исходная база данных.
 +
Б -- конечная база данных.
  
# Полностью все записи.
+
Перед началом процесса проверяем базу А:
# Начиная с определенной даты (для документов -- это дата документа, для справочников дата последнего изменения или создания объекта).
+
  
В процессе переноса потребуются структуры:
+
# отключенные внешние ключи должны быть включены.
 +
# блокировка периода должна быть снята.
 +
# кэш не должен превышать 500 Мб.
 +
# логирование должно быть отключено.
  
# Массив перенесенных идентификаторов.
+
Пользователю рекомендуется провести бэкап-разбэкап исходной базы.
# Cписок массивов требуемых идентификаторов. Каждый массив характеризуется именем таблицы.  
+
  
Последовательность действий при переносе данных:
+
Б создается из копии метаданных А. На время переноса данных отключается
 +
принудительная запись и размер кэша устанавливается не более 500 Мб.
 +
Генератор идентификаторов базы Б увеличивается на заданную дельту.
  
# Выводим суммарные значения и помещаем их в новую БД.
+
В Б создаем структуры:
# Переносим документы.
+
# Переносим справочники.
+
# Трансформируем и переносим складское движение.
+
  
В процессе переноса, для каждой перенесенной записи:
+
# для хранения структуры БД в части удаленных\отключенных объектов метаданных.
 +
# для хранения информации о записях с начальным сальдо.
 +
# для хранения лога изменения данных.
  
# Запоминаем ИД в массиве перенесенных идентификаторов.
+
Считываем и запоминаем структуру базы Б. Деактивируем или удаляем следующие
# Удаляем ИД из списка требуемых ИД для данной таблицы, если он там присутствует.
+
объекты метаданных: триггеры, индексы, чеки, внешние ключи, первичные ключи,
# Для каждой ссылки в записи проверяем не перенесен ли уже соответствующий ИД. Если нет, то помещаем в список требуемых ИД.
+
вычисляемые поля.
  
По окончании переноса проверяем список требуемых ИД и переносим нужные записи. Повторяем, пока список требуемых ИД не будет пуст.
+
Создаем множество R для идентификаторов объектов, подлежащих переносу из А в Б.
  
=== Перенос множеств ===
+
Выводим сальдовые значения и помещаем их в Б. Помещаем в R идентификаторы
 +
объектов, необходимых для суммарных значений.
  
=== Перенос таблиц, связанных 1-к-1 ===
+
Все таблицы мы подразделяем на:
  
=== Перенос таблиц с дополнительной информацией ===
+
* таблицу gd_document
 +
* главные таблицы БО (кроме gd_document)
 +
* таблицы, связанные 1-к-1 в реляционной модели
 +
* детальные таблицы (таблицы с дополнительной информацией, таблицы с позициями документов, таблицы документов)
 +
* таблицы-связки для атрибутов типа множество
 +
* прочие таблицы (без идентификатора ИД или со сложным первичным ключем)
  
[[Category:Постановка]]
+
Списки таблиц упорядочиваем по возрастанию количества внешних ссылок на таблицу.
  
__NOTOC__
+
Алгоритм переноса:
 +
 
 +
# Проходимся по таблицам-связкам для множеств и помещаем в R все встреченные идентификаторы элементов множеств.
 +
# Организуем цикл по прочим таблицам. Для каждой сканируем все записи и добавляем все встреченные ссылки в R.
 +
# Сканируем шапки из таблицы gd_document. Проверям на условия переноса. Если условия выполнены и ИД записи еще нет в R то:
 +
## сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
 +
## добавляем ее идентификатор в R.
 +
# Сканируем позиции из таблицы gd_document. Если ИД записи еще нет в R и ИД шапки находится в R, то:
 +
## сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы. 
 +
## добавляем ее идентификатор в R.
 +
# Организуем цикл по главным таблицам БО. Внутри каждой таблицы организуем цикл по всем записям. Если ИД записи не в R и по условиям она подлегает переносу, то:
 +
## сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
 +
## добавляем ее идентификатор в R.
 +
# Организуем цикл по детальным таблицам и по таблицам 1-к-1. Если ИД главной записи находится в R, то: 
 +
## сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
 +
## добавляем ее идентификатор в R.
 +
# Если в процессе выполнения пунктов 3-6 в R добавлен хотя бы один новый идентификатор, то повторяем цикл начиная с шага 3.
 +
# Переносим данные из А в Б:
 +
## все данные прочих таблиц
 +
## для таблиц с идентификаторами -- все записи, которые зафиксированы в R
 +
## для таблиц-связок, все записи относящиеся к объектам из R 
 +
 
 +
Примечание: при выполнении шагов 5 и 6, если таблица имеет древовидную структуру, то
 +
организуется цикл от первой до последней записи, который повторяется пока в процессе обработки
 +
не было добавлено ни одного нового ИД в R.
 +
 
 +
Восстанавливаем в Б удаленные и деактивированные объекты метаданных.
 +
 
 +
Создаем в Б таблицу и записываем параметры базы А.
 +
 
 +
В базе Б на каждую таблицу создаются триггеры после изменения и после удаления,
 +
которые синхронизируют изменения с базой А. (или фиксируют изменения для последующей
 +
синхронизации).
 +
 
 +
Создаем в А таблицу и записываем параметры базы Б.
 +
 
 +
=========================================
 +
 
 +
ИДА -- значение генератора из БД А на момент старта процесса.
 +
ИДБ = ИДА + 1000000 -- значение генератора в БД Б, устанавливаемое на момент окончания процесса.
 +
 
 +
В базе А создается триггер на коммит транзакции, который проверяет,
 +
если значение генератора больше, чем ИДБ - дельта, то
 +
выдается исключение.
 +
 
 +
=========================================
 +
 
 +
Обратный процесс выглядит следующим образом.
 +
 
 +
Сначала выполняются все отложенные операции синхронизации изменений в Б.
 +
 
 +
Создается база Ц, как копия метаданных базы Б. Запоминается ее структура.
 +
Отключаются индексы, чеки, триггеры, ключи. Переносится на нее информация
 +
из А и из Б. Не переносятся суммарные данные. Восстанавливаются ключи, индексы,
 +
триггеры, чеки.
 +
 
 +
В общем случае потребуется на базу А накатить все настройки, которые были
 +
установлены на Б с момента разъединения этих баз.

Версия 13:16, 20 июня 2011

Принципы ускорения:

  1. последовательное неиндексированное чтение исходных данных
  2. отключение индексов, триггеров, ключей, ограничений на конечной базе данных
  3. массивы идентификаторов для обработки в оперативной памяти
  4. пересылка данных между базами внутри сервера

Примем:

А -- исходная база данных. Б -- конечная база данных.

Перед началом процесса проверяем базу А:

  1. отключенные внешние ключи должны быть включены.
  2. блокировка периода должна быть снята.
  3. кэш не должен превышать 500 Мб.
  4. логирование должно быть отключено.

Пользователю рекомендуется провести бэкап-разбэкап исходной базы.

Б создается из копии метаданных А. На время переноса данных отключается принудительная запись и размер кэша устанавливается не более 500 Мб. Генератор идентификаторов базы Б увеличивается на заданную дельту.

В Б создаем структуры:

  1. для хранения структуры БД в части удаленных\отключенных объектов метаданных.
  2. для хранения информации о записях с начальным сальдо.
  3. для хранения лога изменения данных.

Считываем и запоминаем структуру базы Б. Деактивируем или удаляем следующие объекты метаданных: триггеры, индексы, чеки, внешние ключи, первичные ключи, вычисляемые поля.

Создаем множество R для идентификаторов объектов, подлежащих переносу из А в Б.

Выводим сальдовые значения и помещаем их в Б. Помещаем в R идентификаторы объектов, необходимых для суммарных значений.

Все таблицы мы подразделяем на:

  • таблицу gd_document
  • главные таблицы БО (кроме gd_document)
  • таблицы, связанные 1-к-1 в реляционной модели
  • детальные таблицы (таблицы с дополнительной информацией, таблицы с позициями документов, таблицы документов)
  • таблицы-связки для атрибутов типа множество
  • прочие таблицы (без идентификатора ИД или со сложным первичным ключем)

Списки таблиц упорядочиваем по возрастанию количества внешних ссылок на таблицу.

Алгоритм переноса:

  1. Проходимся по таблицам-связкам для множеств и помещаем в R все встреченные идентификаторы элементов множеств.
  2. Организуем цикл по прочим таблицам. Для каждой сканируем все записи и добавляем все встреченные ссылки в R.
  3. Сканируем шапки из таблицы gd_document. Проверям на условия переноса. Если условия выполнены и ИД записи еще нет в R то:
    1. сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
    2. добавляем ее идентификатор в R.
  4. Сканируем позиции из таблицы gd_document. Если ИД записи еще нет в R и ИД шапки находится в R, то:
    1. сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
    2. добавляем ее идентификатор в R.
  5. Организуем цикл по главным таблицам БО. Внутри каждой таблицы организуем цикл по всем записям. Если ИД записи не в R и по условиям она подлегает переносу, то:
    1. сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
    2. добавляем ее идентификатор в R.
  6. Организуем цикл по детальным таблицам и по таблицам 1-к-1. Если ИД главной записи находится в R, то:
    1. сканируем все поля-ссылки в этой записи и добавляем в R идентификаторы.
    2. добавляем ее идентификатор в R.
  7. Если в процессе выполнения пунктов 3-6 в R добавлен хотя бы один новый идентификатор, то повторяем цикл начиная с шага 3.
  8. Переносим данные из А в Б:
    1. все данные прочих таблиц
    2. для таблиц с идентификаторами -- все записи, которые зафиксированы в R
    3. для таблиц-связок, все записи относящиеся к объектам из R

Примечание: при выполнении шагов 5 и 6, если таблица имеет древовидную структуру, то организуется цикл от первой до последней записи, который повторяется пока в процессе обработки не было добавлено ни одного нового ИД в R.

Восстанавливаем в Б удаленные и деактивированные объекты метаданных.

Создаем в Б таблицу и записываем параметры базы А.

В базе Б на каждую таблицу создаются триггеры после изменения и после удаления, которые синхронизируют изменения с базой А. (или фиксируют изменения для последующей синхронизации).

Создаем в А таблицу и записываем параметры базы Б.

=============================

ИДА -- значение генератора из БД А на момент старта процесса. ИДБ = ИДА + 1000000 -- значение генератора в БД Б, устанавливаемое на момент окончания процесса.

В базе А создается триггер на коммит транзакции, который проверяет, если значение генератора больше, чем ИДБ - дельта, то выдается исключение.

=============================

Обратный процесс выглядит следующим образом.

Сначала выполняются все отложенные операции синхронизации изменений в Б.

Создается база Ц, как копия метаданных базы Б. Запоминается ее структура. Отключаются индексы, чеки, триггеры, ключи. Переносится на нее информация из А и из Б. Не переносятся суммарные данные. Восстанавливаются ключи, индексы, триггеры, чеки.

В общем случае потребуется на базу А накатить все настройки, которые были установлены на Б с момента разъединения этих баз.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты