Привет, Хабр!
Сегодня мы поговорим об актуальной задаче — миграции баз данных с Oracle на PostgreSQL с использованием Ora2Pg. Сейчас популярность PostgreSQL обоснована его мощностями и экономически выгодной альтернативы коммерческим решениям.
Установим
Конечно, понадобятся клиенты Oracle и PostgreSQL. Кроме того, потребуется установить необходимые Perl модули, такие как DBI и DBD::Oracle, которые дадут нам возможность конектится к базам данных Oracle и PostgreSQL соответственно. Для этого может потребоваться установить perl-devel
и perl-CPAN
.
Далее устанавливаем Ora2Pg. Это можно сделать, скачав исходный код из официального репозитория на GitHub, распаковав архив и запустив стандартный процесс установки для Perl модулей:
Конфигурация с помощью
perl Makefile.PL
Компиляция с помощью команды
make
Установка с помощью команды
make install
Конфигурация Ora2Pg и запуск
После установки нужно настроить Ora2Pg для работы с сервером Oracle.
Вся настройка проводится в файлике конфигурации ora2pg.conf
, где указываются параметры подключения к БД Oracle.
Основные параметры настройки в ora2pg.conf:
Определение источника данных Oracle
ORACLE_DSN
: строка подключения к базе данных Oracle, например,dbi:Oracle:host=192.168.1.75;sid=orcl;port=1521
.ORACLE_USER
иORACLE_PWD
: учетные данные для доступа к базе данных Oracle.
Выбор схемы и типа экспорта
SCHEMA
: указывает, какую схему Oracle экспортировать. Это имя схемы чувствительно к регистру.EXPORT_SCHEMA
: если установлено в1
, схема Oracle также будет создана в PostgreSQL.TYPE
: определяет тип объектов для экспорта, например,TABLE
,VIEW
,FUNCTION
.
Настройка экспорта данных
WHERE
: директива, которая позволяет задать условие для фильтрации данных при экспорте. Применяется индивидуально для каждой таблицы.EXCLUDE
: исключает определенные таблицы или объекты из экспорта.
Управление версией PostgreSQL и настройки вывода
PG_VERSION
: версия целевой БД PostgreSQL.OUTPUT
: путь и имя файла, в который будет сохранен результат экспорта.
Дополнительные параметры для управления миграцией
FORCE_OWNER
: принудительно задает владельца для объектов в PostgreSQL, совпадающего с владельцем в Oracle.JOB_NAME
: имя задачи миграции, которое может быть использовано для логирования и отчетности.
Три варианта конфига:
Базовый конфиг для экспорта только таблиц из определенной схемы без данных:
ORACLE_DSN dbi:Oracle:host=oracle_server;sid=orcl;port=1521
ORACLE_USER user
ORACLE_PWD password
PG_VERSION 12
SCHEMA hr
TYPE TABLE
EXPORT_SCHEMA 1
OUTPUT /exports/hr_tables.sql
Конфиг с условиями для фильтрации данных, которые экспортируются из определенных таблиц:
ORACLE_DSN dbi:Oracle:host=oracle_server;sid=orcl;port=1521
ORACLE_USER user
ORACLE_PWD password
PG_VERSION 12
SCHEMA sales
TYPE TABLE,DATA
WHERE (table_name='orders' AND order_date >= '2022-01-01')
OUTPUT /exports/sales_data_filtered.sql
Конфиг с миграцией таблиц, представлений, функций и процедур, которые присутствуют в схеме Oracle:
ORACLE_DSN dbi:Oracle:host=oracle_server;sid=orcl;port=1521
ORACLE_USER user
ORACLE_PWD password
PG_VERSION 13
SCHEMA finance
TYPE TABLE,VIEW,FUNCTION,PROCEDURE
EXPORT_SCHEMA 1
OUTPUT /exports/finance_full_migration.sql
Далее запускаем через командную строку:
ora2pg -c /path/to/your/ora2pg.conf
Во время выполнения миграции Ora2Pg предоставляет подробные логи.
Валидация данных
Нужно обязательно проверить, совпадает ли количество записей в каждой таблице исходной базы данных Oracle с количеством записей в соответствующей таблице PostgreSQL. Это можно выполнить с помощью простого COUNT(*)
в обеих БД.
Далее нужно проверить, что данные в каждом столбце корректно перенесены, особенно это касается дат. Можно использовать хеш-функции или выборочные запросы для проверки этих значений.
В Ora2Pg есть функциональность TEST
для проверки, что все объекты (таблицы, представления, функции и т.д.) были созданы в PostgreSQL. Можно выполнить команду:
ora2pg -t TEST -c config/ora2pg.conf > migration_diff.txt
Эта команда создаст отчет, в котором перечислены все объекты, которые должны были быть мигрированы, и их статус в новой БД.
Так как Ora2Pg автоматом конвертирует PL/SQL в PL/pgSQL, важно проверить, что все хранимые процедуры и функции выполняются без ошибок и возвращают ожидаемые результаты.
Можно юзать готовые SQL-скрипты для облегчения задачи:
Например, этот скрипт помогает проверить, что количество записей в каждой таблице одинаково в обеих базах данных:
SELECT 'EMPLOYEES' AS table_name, COUNT(*) AS total_count FROM EMPLOYEES;
Можно сделать скрипт, который проверяет проверяет, что суммарные значения по важным числовым полям, например как зарплаты или идентификационные номера, совпадают:
SELECT SUM(salary) AS total_salary FROM employees;
А с таким скриптом можно чекнуть, что все ключевые поля были перенесены без дубликаций и пропусков:
SELECT employee_id, COUNT(*) FROM EMPLOYEES GROUP BY employee_id HAVING COUNT(*) > 1;
В преддверии старта курса "PostgreSQL для администраторов БД и разработчиков" приглашаю всех на бесплатный про полнотекстовый поиск в PostgreSQL. Зарегистрироваться.