Сегодня мы поговорим об актуальной задаче — миграции баз данных с Oracle на PostgreSQL с использованием Ora2Pg. Сейчас популярность PostgreSQL обоснована его мощностями и экономически выгодной альтернативы коммерческим решениям.
Далее устанавливаем Ora2Pg. Это можно сделать, скачав исходный код из официального репозитория на GitHub, распаковав архив и запустив стандартный процесс установки для Perl модулей:
Вся настройка проводится в файлике конфигурации ora2pg.conf, где указываются параметры подключения к БД Oracle.
Основные параметры настройки в ora2pg.conf:
Базовый конфиг для экспорта только таблиц из определенной схемы без данных:
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 предоставляет подробные логи.
Далее нужно проверить, что данные в каждом столбце корректно перенесены, особенно это касается дат. Можно использовать хеш-функции или выборочные запросы для проверки этих значений.
В 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;
habr.com
Установим
Конечно, понадобятся клиенты 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;

Как перейти с Oracle на PostgreSQL, используя Ora2Pg
Привет, Хабр! Сегодня мы поговорим об актуальной задаче — миграции баз данных с Oracle на PostgreSQL с использованием Ora2Pg . Сейчас популярность PostgreSQL обоснована его мощностями и экономически...
