Перенос данных на чистую базу (постановка)
SYSDBA (обсуждение | вклад) (→Перенос таблиц с дополнительной информацией) |
SYSDBA (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | + | Принципы ускорения: | |
| − | # | + | # последовательное неиндексированное чтение исходных данных |
| − | # | + | # отключение индексов, триггеров, ключей, ограничений на конечной базе данных |
| − | + | # массивы идентификаторов для обработки в оперативной памяти | |
| − | + | # пересылка данных между базами внутри сервера | |
| − | # | + | |
| − | # | + | |
| − | + | ||
| − | + | Примем: | |
| − | + | А -- исходная база данных. | |
| + | Б -- конечная база данных. | ||
| − | + | Перед началом процесса проверяем базу А: | |
| − | + | ||
| − | + | # отключенные внешние ключи должны быть включены. | |
| + | # блокировка периода должна быть снята. | ||
| + | # кэш не должен превышать 500 Мб. | ||
| + | # логирование должно быть отключено. | ||
| − | + | Пользователю рекомендуется провести бэкап-разбэкап исходной базы. | |
| − | + | ||
| − | + | Б создается из копии метаданных А. На время переноса данных отключается | |
| + | принудительная запись и размер кэша устанавливается не более 500 Мб. | ||
| + | Генератор идентификаторов базы Б увеличивается на заданную дельту. | ||
| − | + | В Б создаем структуры: | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | # для хранения структуры БД в части удаленных\отключенных объектов метаданных. | |
| + | # для хранения информации о записях с начальным сальдо. | ||
| + | # для хранения лога изменения данных. | ||
| − | + | Считываем и запоминаем структуру базы Б. Деактивируем или удаляем следующие | |
| − | + | объекты метаданных: триггеры, индексы, чеки, внешние ключи, первичные ключи, | |
| − | + | вычисляемые поля. | |
| − | + | Создаем множество R для идентификаторов объектов, подлежащих переносу из А в Б. | |
| − | + | Выводим сальдовые значения и помещаем их в Б. Помещаем в R идентификаторы | |
| + | объектов, необходимых для суммарных значений. | ||
| − | + | Все таблицы мы подразделяем на: | |
| − | + | * таблицу gd_document | |
| + | * главные таблицы БО (кроме gd_document) | ||
| + | * таблицы, связанные 1-к-1 в реляционной модели | ||
| + | * детальные таблицы (таблицы с дополнительной информацией, таблицы с позициями документов, таблицы документов) | ||
| + | * таблицы-связки для атрибутов типа множество | ||
| + | * прочие таблицы (без идентификатора ИД или со сложным первичным ключем) | ||
| − | + | Списки таблиц упорядочиваем по возрастанию количества внешних ссылок на таблицу. | |
| − | + | Алгоритм переноса: | |
| + | |||
| + | # Проходимся по таблицам-связкам для множеств и помещаем в 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
Принципы ускорения:
- последовательное неиндексированное чтение исходных данных
- отключение индексов, триггеров, ключей, ограничений на конечной базе данных
- массивы идентификаторов для обработки в оперативной памяти
- пересылка данных между базами внутри сервера
Примем:
А -- исходная база данных. Б -- конечная база данных.
Перед началом процесса проверяем базу А:
- отключенные внешние ключи должны быть включены.
- блокировка периода должна быть снята.
- кэш не должен превышать 500 Мб.
- логирование должно быть отключено.
Пользователю рекомендуется провести бэкап-разбэкап исходной базы.
Б создается из копии метаданных А. На время переноса данных отключается принудительная запись и размер кэша устанавливается не более 500 Мб. Генератор идентификаторов базы Б увеличивается на заданную дельту.
В Б создаем структуры:
- для хранения структуры БД в части удаленных\отключенных объектов метаданных.
- для хранения информации о записях с начальным сальдо.
- для хранения лога изменения данных.
Считываем и запоминаем структуру базы Б. Деактивируем или удаляем следующие объекты метаданных: триггеры, индексы, чеки, внешние ключи, первичные ключи, вычисляемые поля.
Создаем множество R для идентификаторов объектов, подлежащих переносу из А в Б.
Выводим сальдовые значения и помещаем их в Б. Помещаем в R идентификаторы объектов, необходимых для суммарных значений.
Все таблицы мы подразделяем на:
- таблицу gd_document
- главные таблицы БО (кроме gd_document)
- таблицы, связанные 1-к-1 в реляционной модели
- детальные таблицы (таблицы с дополнительной информацией, таблицы с позициями документов, таблицы документов)
- таблицы-связки для атрибутов типа множество
- прочие таблицы (без идентификатора ИД или со сложным первичным ключем)
Списки таблиц упорядочиваем по возрастанию количества внешних ссылок на таблицу.
Алгоритм переноса:
- Проходимся по таблицам-связкам для множеств и помещаем в 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 -- значение генератора в БД Б, устанавливаемое на момент окончания процесса.
В базе А создается триггер на коммит транзакции, который проверяет, если значение генератора больше, чем ИДБ - дельта, то выдается исключение.
=============================
Обратный процесс выглядит следующим образом.
Сначала выполняются все отложенные операции синхронизации изменений в Б.
Создается база Ц, как копия метаданных базы Б. Запоминается ее структура. Отключаются индексы, чеки, триггеры, ключи. Переносится на нее информация из А и из Б. Не переносятся суммарные данные. Восстанавливаются ключи, индексы, триггеры, чеки.
В общем случае потребуется на базу А накатить все настройки, которые были установлены на Б с момента разъединения этих баз.