Как перейти с Oracle на PostgreSQL, используя Ora2Pg

8c267a41b7fae1cc6caa5cf0e1db1ccd.png

Привет, Хабр!

Сегодня мы поговорим об актуальной задаче — миграции баз данных с 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:

  1. Определение источника данных Oracle

    • ORACLE_DSN: строка подключения к базе данных Oracle, например, dbi:Oracle:host=192.168.1.75;sid=orcl;port=1521.

    • ORACLE_USER и ORACLE_PWD: учетные данные для доступа к базе данных Oracle.

  2. Выбор схемы и типа экспорта

    • SCHEMA: указывает, какую схему Oracle экспортировать. Это имя схемы чувствительно к регистру.

    • EXPORT_SCHEMA: если установлено в 1, схема Oracle также будет создана в PostgreSQL.

    • TYPE: определяет тип объектов для экспорта, например, TABLE, VIEW, FUNCTION.

  3. Настройка экспорта данных

    • WHERE: директива, которая позволяет задать условие для фильтрации данных при экспорте. Применяется индивидуально для каждой таблицы.

    • EXCLUDE: исключает определенные таблицы или объекты из экспорта.

  4. Управление версией PostgreSQL и настройки вывода

    • PG_VERSION: версия целевой БД PostgreSQL.

    • OUTPUT: путь и имя файла, в который будет сохранен результат экспорта.

  5. Дополнительные параметры для управления миграцией

    • 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. Зарегистрироваться.

© Habrahabr.ru