Миграция с Oracle на PostgreSQL: перенос PL/SQL, данных и приложений с точкой отката

Миграция с Oracle на PostgreSQL — это перенос поведения, а не только таблиц: PL/SQL, заданий, прав и привычек приложений. Начинаем с реестра объектов и запросов, переносим на стенд, сверяем данные, гоняем вашу нагрузку и переключаем с точкой отката. Oracle остаётся рабочим, пока новая база не отработала срок без замечаний.

Обследование и план — от 250 000 ₽, 2–3 неделиПеренос — от 800 000 ₽, цена после обследованияOracle — точка отката до конца параллельного периода

На чём держится

Четыре вещи, о которых говорим до договора

Первая из них объясняет, почему перенос ломается не на таблицах, остальные — как мы с этим работаем.

Переносим поведение, а не таблицы

Данные переносятся предсказуемо. Дорого обходится поведение: как база обращается с пустой строкой, датой, ошибкой внутри транзакции. Код может отработать без единой ошибки и вернуть другой результат, поэтому мы проверяем смысл, а не синтаксис.

Сначала реестр, потом цена

Что лежит в базе, кто к ней обращается и что она делает ночью — без этого срок и сумма превращаются в догадку. Обследование стека и план — от 250 000 ₽, цена фиксированная и вычитается из следующего этапа.

Конвертер — черновик, а не исполнитель

Инструменты вроде ora2pg считают объекты, переносят структуру и дают заготовку кода. Решает человек: каждую процедуру, триггер и пакет читают и сверяют на одинаковых данных. Отчёт конвертера по вашей базе показываем целиком.

Oracle не выключаем, пока не подтвердили

До конца параллельного периода старая база остаётся рабочей и служит точкой отката. Остановка записи на переключении всё равно будет: её длину называем заранее и пишем в регламент, а не обещаем «без простоя».

Зачем это нужно

Почему перенос базы Oracle на PostgreSQL застревает

Логика живёт в пакетах PL/SQL

Годами копились процедуры, триггеры и пакеты. Авторов нет, документации нет, а часть правил бизнеса существует только там.

Неизвестно, кто ходит в базу

Отчёты, скрипты и приложения подключаются напрямую. Часть из них без исходников, часть работает под чужими учётными записями.

Прошлая попытка встала

Конвертер перенёс таблицы, дошёл до первой несовместимости и остановился. С тех пор ситуация не улучшилась.

Задания и связи работают ночью

Планировщик, ссылки на другие базы, выгрузки в файлы и по почте. О них вспоминают, когда ночью что-то не пришло.

Непонятно, выдержит ли PostgreSQL нагрузку

Оптимизатор строит планы иначе, а подсказок в ядре нет. Запрос, который летал, может замедлиться, и узнать это нужно до переключения.

Срок задан снаружи, а сметы расходятся

Лицензия или поддержка заканчиваются, а три подрядчика назвали три суммы. Частая причина расхождения — разный учёт логики: одни считают только таблицы, другие читают каждую процедуру.

Что ломается

Замена Oracle на PostgreSQL по объектам: что в Oracle, что в PostgreSQL, что делаем

Таблица — типовой список. В вашей базе встретится часть строк, и найти именно их — задача обследования. Версии и состав расширений уточняем для вашей сборки.

Что в Oracle
В PostgreSQL
Работа
Что делаем
Что в OracleПакеты PL/SQLспецификация, тело, переменные пакета
В PostgreSQLСхема с функциями; в обычном PostgreSQL аналога пакета нет
РаботаПереписать
Что делаемРаскладываем по схемам, состояние пакета (переменные на время сессии) выносим в параметры, временные таблицы или настройки сессии; проверяем порядок инициализации
Что в OracleПроцедуры, функции, триггерыPL/SQL
В PostgreSQLPL/pgSQL
РаботаПереписать
Что делаемЯзык близкий, но не тот же: иначе устроены ошибки, курсоры, коллекции и триггеры. Конвертер даёт черновик, человек читает и переписывает; результаты сравниваем на одинаковых входных данных
Что в OracleАвтономные транзакцииPRAGMA AUTONOMOUS_TRANSACTION
В PostgreSQLВ обычном PostgreSQL встроенного аналога нет
РаботаПереосмыслить
Что делаемВыясняем, зачем они нужны (чаще всего для журнала и аудита), и заменяем отдельным соединением, очередью или переписанной логикой
Что в OracleИерархические запросыCONNECT BY, LEVEL
В PostgreSQLWITH RECURSIVE
РаботаПереписать
Что делаемПорядок обхода и защиту от циклов задаём явно: сами они не появятся
Что в OracleROWNUM, ROWID, DUALи функции NVL, DECODE, SYSDATE
В PostgreSQLLIMIT, coalesce, CASE, clock_timestamp()
РаботаЗаменить
Что делаемЧасть функций даёт расширение orafce. Заменяем в коде базы и в SQL приложений; если где-то используется ROWID, выясняем, чем заменить ключ. DECODE переносим в CASE осторожно: DECODE считает два NULL равными, а CASE нет
Что в OracleВнешние соединения (+) и MERGE
В PostgreSQLJOIN, INSERT … ON CONFLICT
РаботаПереписать
Что делаемMERGE появился в новых версиях PostgreSQL, но ведёт себя не во всём как в Oracle (уточняйте для своей версии). Проверяем под параллельной нагрузкой: именно там расходятся блокировки и обработка одновременных вставок (возможны ошибки уникальности, поэтому часто берут INSERT … ON CONFLICT)
Что в OracleПоследовательности и столбцы идентификации
В PostgreSQLSequence, identity
РаботаПеренести
Что делаемПереносим текущие значения с запасом и проверяем, что ключи не повторятся. Пропуски номеров допустимы и там, и там
Что в OracleТипы данныхNUMBER, DATE, VARCHAR2, CLOB, RAW
В PostgreSQLnumeric, integer, bigint, timestamp, varchar, text, bytea
РаботаПодобрать
Что делаемТип подбираем по реальным значениям и по тому, как столбец используется, а не по названию. NUMBER без точности «в лоб» в numeric — это медленнее целочисленных типов
Что в OracleСинонимы и ссылки на другие базыsynonym, database link
В PostgreSQLsearch_path, представления, postgres_fdw, dblink
РаботаЗаменить
Что делаемРешаем по каждой ссылке: убрать, заменить обменом или оставить через fdw. Смотрим, что фактически уходит на удалённую сторону
Что в OracleВстроенные пакетыDBMS_OUTPUT, DBMS_LOCK, UTL_FILE, UTL_HTTP, DBMS_SQL
В PostgreSQLЧастично расширение orafce и сама СУБД
РаботаЗаменить
Что делаемСнимаем список реально вызываемых, для каждого выбираем замену (расширение или логика в приложении) и проверяем её на данных
Что в OracleЗадания планировщикаDBMS_SCHEDULER, DBMS_JOB
В PostgreSQLpg_cron или внешний планировщик
РаботаПеренести
Что делаемВстроенного планировщика в ядре нет. Переносим расписания, добавляем защиту от двойного запуска и оповещение о неудачном запуске
Что в OracleСекционирование
В PostgreSQLДекларативные секции
РаботаНастроить
Что делаемДиапазонные, списочные и хэш-секции есть; автоматического создания секций по интервалу в ядре нет. Создание секций делаем заданием или расширением и проверяем планы запросов по секциям
Что в OracleПодсказки, планы, статистикаоптимизатор
В PostgreSQLПланы строятся иначе; подсказок в ядре нет
РаботаНастроить
Что делаемЕсть сторонние расширения вроде pg_hint_plan. Снимаем планы до и после, правим индексы, статистику и сами запросы; подсказки — последняя мера
Что в OracleКодировка и сортировкаNLS_CHARACTERSET, NLS_SORT
В PostgreSQLКодировка базы (обычно UTF-8), правила сортировки ОС или ICU
РаботаПроверить
Что делаемПроверяем длины полей (в байтах или в символах), порядок строк с кириллицей, регистронезависимый поиск и регистр имён объектов (без кавычек Oracle хранит их в верхнем регистре, PostgreSQL — в нижнем): на данных, а не по документации

Те же места в виде пошагового плана разобраны в статье «Как перейти с Oracle на PostgreSQL». Здесь — то, что мы по каждому решаем на проекте.

Тихие различия

Код отработал без ошибок, а результат другой

Эти различия не дают сообщения об ошибке, поэтому находят их сравнением результатов, а не запуском. Слева привычное поведение Oracle, справа — что произойдёт, если перенести код без правок.

Привычное поведение Oracle
Что будет в PostgreSQL при переносе как есть
OracleПустая строка равна NULL: сравнение с пустой строкой ничего не находит
PostgreSQL как естьПустая строка — обычное значение, не NULL. Условия, уникальные ключи и проверки NOT NULL ведут себя иначе
OracleСклейка строки с NULL возвращает строку
PostgreSQL как естьСклейка с NULL даёт NULL. Нужны concat() или coalesce
OracleДеление чисел типа NUMBER даёт дробь: 5 / 2 = 2,5
PostgreSQL как естьЕсли столбец стал целочисленным, 5 / 2 = 2. Дробная часть пропала молча
OracleDATE хранит дату и время до секунд
PostgreSQL как естьТип date хранит только дату, время теряется, если тип выбран по названию. Нужен timestamp
OracleSYSDATE возвращает текущее время сервера, и внутри долгой транзакции оно идёт вперёд
PostgreSQL как естьnow() и current_timestamp фиксируются на начало транзакции. Для прежнего поведения берут clock_timestamp() или statement_timestamp(): выбор зависит от того, что нужно коду
OracleОшибка в операторе откатывает только его, транзакция продолжается
PostgreSQL как естьОшибка отменяет всю транзакцию до отката или точки сохранения. Приложение, которое «проглатывало» ошибку и шло дальше, ломается
OracleУсловие по ROWNUM применяется до ORDER BY: «первые десять» — произвольные десять
PostgreSQL как естьLIMIT применяется после сортировки и возвращает действительно первые десять, то есть другие строки
OracleDDL сам фиксирует транзакцию
PostgreSQL как естьDDL (за редкими исключениями) транзакционный и откатывается. Код, рассчитывавший на неявную фиксацию, ведёт себя иначе
OracleSELECT INTO без строк или с несколькими строками даёт ошибку NO_DATA_FOUND или TOO_MANY_ROWS
PostgreSQL как естьВ PL/pgSQL без указания STRICT ошибки нет: переменная остаётся пустой или берётся первая строка. Обработчики исключений не срабатывают, логика идёт дальше с пустым значением
OracleDECODE считает два значения NULL равными
PostgreSQL как естьПростой CASE x WHEN NULL не срабатывает никогда. Нужна явная ветка IS NULL или сравнение IS NOT DISTINCT FROM

Отсюда правило приёмки: результаты процедур и отчётов сравниваем на одинаковых входных данных построчно, а порядок сортировки проверяем отдельным пунктом.

Вокруг базы

Что переезжает вместе с базой, хотя в схеме его нет

Этих вещей нет в списке таблиц, но их отсутствие замечают первыми.

Резервные копии и восстановление

Сценарии RMAN не переносятся. Строим копии с архивом журнала предзаписи, WAL (например, pgBackRest или Barman) и проверяем восстановление на точку во времени учебным запуском.

Отказоустойчивость

Аналога RAC в обычном PostgreSQL нет. Задачу решают репликацией и автоматическим переключением (например, Patroni); схему считаем под ваши требования к простою и потере данных.

Права, аудит, шифрование

Пользователей и роли переносим, но системные привилегии Oracle прямых аналогов не имеют, поэтому права сверяем по факту. Тонкий доступ по строкам собирается заново (row-level security), аудит даёт расширение вроде pgaudit. Прозрачное шифрование зависит от сборки: требования проверяем заранее.

Материализованные представления

Быстрого (инкрементального) обновления в ядре нет, обновление полное. Для больших представлений считаем время и при необходимости заменяем таблицей с догрузкой.

Очереди внутри базы

Механизмы вроде Advanced Queuing заменяют внешним брокером или таблицей-очередью с блокировкой строк. Выясняем, кто пишет в очередь и кто из неё читает.

Подключения

В PostgreSQL каждое соединение — отдельный процесс, и очень много одновременных соединений обходится дорого. Ставим пул соединений (например, PgBouncer) и проверяем настройки приложений.

Инвентаризация

Инвентаризация перед переносом базы Oracle: что собираем и откуда

Без неё цена и срок — догадка. Все названия словарных представлений ниже — примеры, точный набор уточняем для вашей версии Oracle.

Что собираем
Откуда берём
Кто делает
Что ищем
Что собираемОбъекты и зависимоститаблицы, пакеты, процедуры, представления
Откуда берёмСловарь Oracle (например, DBA_OBJECTS, DBA_SOURCE, DBA_DEPENDENCIES)
Кто делаетМы, по доступу на чтение
Что ищемНевалидные объекты, мёртвый код, цепочки вызовов, объекты, о которых никто не знает
Что собираемSQL приложенийкто что спрашивает у базы
Откуда берёмИсходники приложений, статистика запросов, трассировка работающей системы за представительный период
Кто делаетВместе
Что ищемКонструкции, специфичные для Oracle, внутри кода, запросы приложений без исходников, редкие запросы закрытия периода
Что собираемЗадания и внешние обращения
Откуда берёмПланировщик, ссылки на другие базы, каталоги, внешние таблицы, вызовы UTL_*
Кто делаетМы
Что ищемЧто запускается ночью, что пишет в файлы и отправляет почту, откуда база читает чужие данные
Что собираемПодключениякто и откуда
Откуда берёмСессии, журнал прослушивателя, учётные записи
Кто делаетМы
Что ищемПриложения под общими учётками, ручные скрипты администраторов, BI-системы
Что собираемПрава и аудит
Откуда берёмРоли, привилегии, профили, политики доступа
Кто делаетМы
Что ищемПрава «на всякий случай», доступ по строкам, требования к журналу действий
Что собираемНагрузкапрофиль запросов
Откуда берёмСтатистика Oracle, доступная вам по лицензии, и журналы приложений
Кто делаетВместе
Что ищемСамые частые и самые тяжёлые запросы, пики, окно закрытия периода
Что собираемОбъём и рост
Откуда берёмСегменты, большие объекты (LOB), архивы
Кто делаетМы
Что ищемТаблицы-гиганты, журналы без очистки, данные, которые можно не переносить

Если у приложения нет исходников, объём работ определяется в первую очередь трассировкой работающей системы. Любая цена без неё — оценка на глаз.

Куда переносим

Миграция Oracle на Postgres Pro, Tantor или обычный PostgreSQL: как выбрать сборку

Названия сборок — примеры. Реестр российского ПО, версии и лицензионные условия меняются, поэтому проверяйте их на дату решения. Мы помогаем сравнить варианты, выбор и договор с вендором остаются за вами.

Вариант
Когда рассматривают
Поддержка
Что проверить до выбора
ВариантPostgreSQL (обычная сборка)
Когда рассматриваютНет требований к реестру, есть свои администраторы, нужен широкий выбор расширений
ПоддержкаВы или подрядчик
Что проверить до выбораКто следит за обновлениями безопасности и отвечает за поддержку; какие расширения нужны вам
ВариантРоссийские сборкиPostgres Pro, Tantor — как примеры
Когда рассматриваютНужна запись в реестре российского ПО, поддержка вендора, функции, которых нет в обычной версии
ПоддержкаВендор сборки
Что проверить до выбораАктуальную запись в реестре, срок поддержки, версию ядра, лицензионные условия и состав расширений (orafce, pg_cron, pg_hint_plan)
ВариантСборка с расширенной совместимостью с Oracle
Когда рассматриваютМного пакетов PL/SQL, переписывать которые дорого
ПоддержкаВендор сборки
Что проверить до выбораЧто именно поддерживается и в какой версии: проверяем на ваших пакетах, а не по презентации. Чем больше опоры на возможности вендора, тем сильнее зависимость от него
ВариантЧасть баз остаётся на Oracle
Когда рассматриваютПриложение вендора не поддерживает PostgreSQL, исходников нет, переписывать нечем
ПоддержкаOracle
Что проверить до выбораЭто нормальный результат обследования: переносим то, что переносится, а остальное фиксируем с причиной
Фазы

Как идёт миграция с Oracle на PostgreSQL: восемь шагов

От списка объектов до вывода старой базы. Остановиться можно после любого шага: всё сделанное остаётся у вас по акту.

  1. ИнвентаризацияРеестр объектов, зависимостей, заданий и потребителей; профиль нагрузки. Результат — список того, что есть на самом деле, а не в документации.
  2. Оценка совместимостиПрогон конвертера, ручной просмотр, оценка по позициям: сколько объектов переносится как есть, сколько переписывается и какие не переносятся вовсе.
  3. Целевая платформа и схемаСборка PostgreSQL, версии, расширения, схема копий и отказоустойчивости. Критерии приёмки и точки отката — письменно.
  4. Схема и данные на стендеЗагрузка, сверка строк и контрольных сумм. Перенос оформлен скриптами и повторяется сколько нужно раз.
  5. Логика: PL/SQL в PL/pgSQLКаждый объект читается, переписывается и сравнивается с исходным на одинаковых данных. Задания, ссылки между базами и встроенные пакеты — здесь же.
  6. Приложения и отчётыПравим SQL там, где он зашит в код. Где исходников нет — слой совместимости или решение оставить эту базу как есть.
  7. Нагрузка и сверкаПрогон вашего профиля запросов, планы и индексы; бизнес-сверка данных и результатов отчётов.
  8. Параллельный период и переключениеИзменения догоняют новую базу, идёт сверка, отрепетированы переключение и откат. Окно записи — по регламенту, Oracle выводим после срока без замечаний.
Данные

Данные и сверка: пять уровней проверки

Перенос данных — самая предсказуемая часть. Труднее доказать, что перенесено всё и без искажений.

Уровень
Что сравниваем
Что ловит
Чего не ловит
УровеньКоличество строкпо таблицам и секциям
Что сравниваемЧисло строк на зафиксированный момент в обеих базах
Что ловитПотерянные и задвоенные строки
Чего не ловитИскажённые значения в уцелевших строках
УровеньКонтрольные суммыпо диапазонам ключа
Что сравниваемХэш значений столбцов, обе стороны считают одинаково
Что ловитИскажения при кодировке, округлении, усечении
Чего не ловитРазный смысл при одинаковом значении, например NULL и пустая строка
УровеньВыборка с краевыми значениями
Что сравниваемСтроки с NULL, пустыми строками, граничными датами, длинными и кириллическими значениями
Что ловитОшибки типа, длины, часового пояса
Чего не ловитРедкие значения вне выборки
УровеньБизнес-сверка
Что сравниваемОстатки, обороты, число открытых документов, суммы по периодам
Что ловитТо, что увидит бухгалтер или технолог
Чего не ловитОшибки, которые компенсируют друг друга
УровеньОтчёты и процедуры
Что сравниваемОдни входные данные на обеих сторонах, сравнение построчно; сортировка отдельным пунктом
Что ловитОшибки логики и сортировки
Чего не ловитПоведение под нагрузкой: его проверяет отдельный прогон

Способ загрузки выбираем по объёму и допустимой остановке: выгрузка и загрузка файлами, чтение из Oracle через oracle_fdw, для догона изменений — репликация журнала (например, Debezium или средства самого Oracle, если они у вас есть). Что подойдёт, зависит от версии Oracle и объёма журналов; решаем на обследовании.

Производительность

Сравнение производительности Oracle и PostgreSQL на вашей нагрузке

Быстрый способ ошибиться — сравнить два-три запроса, которые вспомнили. Дорогой — не снять замер до переноса.

Что сравниваем
Как сравнивают на глаз
Как делаем мы
Какая нагрузка
ОбычноБерут несколько запросов, которые вспомнили
МыСнимаем профиль на работающей базе за представительный период, включая закрытие периода и пики
Когда замеряем
ОбычноПосле переноса, когда сравнивать уже не с чем
МыДо переноса: базовый замер хранится как эталон
Чем снимаем
ОбычноТем, что под рукой, или ничем
МыСтатистикой Oracle из доступных вам источников (AWR доступен только при соответствующей лицензии Oracle, иначе Statspack или трассировка); на стороне PostgreSQL — pg_stat_statements и auto_explain
Что считаем результатом
ОбычноСреднее время запроса
МыВремя ключевых операций и «хвост» самых медленных вызовов, а не среднее
Что делаем с медленным
ОбычноДобавляем железо
МыСмотрим план: индекс, статистика, переписанный запрос. Параметры и подсказки — в последнюю очередь
Критерий приёмки
ОбычноПользователи не жалуются
МыПорог по каждой ключевой операции, согласованный письменно до начала работ

Планировщик PostgreSQL устроен иначе: запрос, который летал на Oracle, может замедлиться, и наоборот. Поэтому до приёмки мы называем не «будет быстрее», а порог по каждой ключевой операции.

Предел

Где перенос упирается в приложения

Приложения со встроенным Oracle-SQL

База переезжает целиком только тогда, когда можно изменить приложения, которые к ней обращаются. SQL, зашитый в код, отчёты и слой доступа с диалектом Oracle (NVL, DECODE, ROWNUM, внешние соединения (+), CONNECT BY, обращения к последовательностям, разбор кодов ORA-) придётся править там, где он написан.

Если исходников нет, возможны три пути: слой совместимости между приложением и базой (представления и функции, повторяющие привычные вызовы), доработка у вендора или решение оставить эту базу на Oracle. Какой путь честный, видно из инвентаризации по трассировке запросов, а не из документации. Oracle Forms, Reports и APEX привязаны к Oracle и не переезжают вместе с базой (приложения APEX хранятся внутри самой базы Oracle): это отдельный проект, и мы оцениваем его отдельно.

Ваша сторона

Что нужно от вас при переносе

Перенос не делается в закрытой комнате. Без этих шести вещей он замедляется, а оценка срока перестаёт работать.

Доступ на чтение

Учётная запись с правом читать словарь и статистику. В боевой базе без согласования ничего не меняем.

Владельцы приложений

Люди, которые могут изменить код приложений или обратиться к вендору с запросом на поддержку PostgreSQL.

Приёмщики данных

Бухгалтер, технолог или аналитик, которые подтверждают бизнес-сверку: цифры должен признавать тот, кто ими пользуется.

Тестовый контур

Стенд с копией данных (при необходимости обезличенной) и серверы под PostgreSQL.

Решение по платформе

Сборка, поддержка и лицензионные условия — ваше решение и ваш договор с вендором.

Окно переключения

Согласованное время, когда запись остановлена, а ответственные от бизнеса и от ИТ на связи.

Что делаем

Перенос PL/SQL, данных и приложений: что входит в работу

Перенос — от 800 000 ₽, итог зависит от числа объектов PL/SQL и приложений. Сроки этапов — ориентиры для типовой базы: часть этапов идёт одновременно, поэтому общий срок не равен их сумме, а точные цифры называем после обследования. Перенос серверов на Linux считается отдельно. Ступени цен — на странице «Цены и сроки», общий обзор услуги — на странице «Миграция на СУБД и Linux».

Обследование и оценка совместимости

Реестр объектов и зависимостей, запросы приложений, профиль нагрузки, отчёт о совместимости. Цена фиксированная, от 250 000 ₽, и вычитается из следующего этапа.

2–3 недели

Схема и данные

Таблицы, индексы, ограничения, последовательности, права. Загрузка, сверка строк и контрольных сумм.

2–4 недели

Перенос PL/SQL

Пакеты, процедуры, функции, триггеры, задания, ссылки между базами. Сконвертированное читаем руками.

3–8 недель

Приложения и отчёты

Правка SQL, зашитого в код, смена диалекта в слое доступа, слой совместимости там, где исходников нет.

2–6 недель

Нагрузка и настройка

Прогон вашего профиля запросов, планы, индексы, параметры. Сравнение с замером, снятым до переноса.

1–3 недели

Копии и отказоустойчивость

Резервное копирование с проверкой восстановления, репликация, автоматическое переключение, мониторинг.

1–3 недели

Параллельный период и переключение

Догон изменений, ежедневная сверка, репетиция отката, регламент переключения. Старая база остаётся рабочей.

по объёму

Обучение и сопровождение

Инструкции и обучение администраторов (включая автоочистку vacuum и контроль раздувания таблиц), разбор инцидентов после запуска. Сверх пакета — 5 000 ₽ в час.

от 20 000 ₽/мес
Как устроено

Как переключаем боевую нагрузку поэтапно

ПОЭТАПНОЕ ПЕРЕКЛЮЧЕНИЕСтендкопия данных, логика,сверкаПараллельный периодOracle главный, PostgreSQLдогоняетРепетицияпереключение и откат накопииПереключениезапись переходит вPostgreSQLВывод Oracleпосле срока без замечанийТочка откатаусловия решаем и пишем допереключенияДо открытия записи в PostgreSQL откат — это возврат подключений приложений на Oracle.После открытия записи откат без обратной репликации теряет новые изменения.
Откат дёшев, пока записывает только Oracle. Как только боевая запись пошла в PostgreSQL, вернуть всё назад без потерь можно лишь при обратной репликации. Она сложна, и нужна ли она, решается до переключения, а не в момент аварии.
Процесс

Как идёт работа: от обследования до вывода Oracle

Остановиться можно после любого этапа: отчёт, скрипты и протоколы остаются у вас по акту.

Недели 1–3 — Обследование и план

Реестр объектов и зависимостей, запросы приложений, профиль нагрузки, отчёт о совместимости с оценкой по позициям. Остановиться можно здесь: отчёт остаётся у вас.

Следом — Стенд, схема и данные

Поднимаем PostgreSQL на стенде, переносим схему и данные, сверяем строки и контрольные суммы. Перенос оформлен скриптами и повторяется.

Основная часть — Логика и приложения

PL/SQL в PL/pgSQL, задания, связи между базами, правки SQL в приложениях. Каждый объект читаем и сравниваем с исходным на одинаковых данных.

Далее — Нагрузка и настройка

Прогон реального профиля, планы, индексы, параметры. Сравнение с замером до переноса и с порогами, согласованными заранее.

Затем — Параллельный период

Изменения догоняют новую базу, сверка идёт по расписанию, расхождения разбираются. Отрепетированы переключение и откат.

Переключение и передача

Остановка записи по регламенту, наблюдение в первые дни в согласованные часы, затем документы, обучение администраторов и, по желанию, сопровождение.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Скрипты конвертации и переноса — в вашем репозитории; перенос можно повторить в любой момент.
  • Реестр объектов и зависимостей: что есть, кто вызывает, что уже перенесено.
  • Протокол сверки данных и отчётов, результаты замеров до и после.
  • Регламент переключения с точкой отката и инструкции для администраторов: копии, мониторинг, обслуживание.
  • Старая база Oracle нетронутой и доступной для отката до конца периода.

Мы этого не делаем

  • Не обещаем перенос совсем без остановки: окно остановки записи на переключении есть, его длина зависит от схемы.
  • Не доверяем автоконвертации: каждый объект читает человек.
  • Не переписываем в рамках переноса базы Oracle Forms, Reports, APEX и чужие приложения без исходников: это отдельная оценка.
  • Не обещаем экономию на лицензиях: она зависит от вашего договора с вендором. Не берём на себя выбор вендора и его лицензионные условия.
  • Не проводим сертификацию и аттестацию: лицензии ФСТЭК у нас нет. Не даём юридических заключений по реестру и срокам.
Материалы

Что почитать про перенос Oracle на PostgreSQL

Статья про шаги, разбор похожей задачи на другой СУБД и общие страницы про миграцию. Разбор — про типовую задачу, а не про наш проект.

Материал

Как перейти с Oracle на PostgreSQL: план и подводные камни

Пять шагов миграции и список того, что ломается чаще всего. Эта страница разбирает те же шаги глубже, с таблицами по объектам.

  • Пять шагов миграции
  • Что ломается чаще всего
Читать →
Разбор типовой задачи

Перенос базы с MS SQL на PostgreSQL к сроку

Разбор похожей задачи на другой СУБД, а не описание нашего проекта: трассировка запросов, сверка и репетиция отката.

  • Реестр зависимостей из трассировки
  • Репетиция отката
Читать разбор →
Страница услуги

Миграция на PostgreSQL с Oracle и MS SQL

Общая страница про перенос баз: для обеих СУБД, без деталей по Oracle.

  • Oracle и MS SQL
  • Параллельный период
Смотреть →
Страница услуги

Переход с Windows Server на Linux

Если база стоит на Windows Server, перенос серверов и каталога пользователей идёт отдельной работой.

  • Службы по одной
  • Откат на каждом шаге
Смотреть →
Инструменты

Чем переносим и на чём запускаем

Названия — примеры. Состав подбираем под вашу версию Oracle, выбранную сборку PostgreSQL и требования контура.

Перенос и сверка
  • ora2pg: отчёт о совместимости и заготовка конвертации
  • oracle_fdw: чтение из Oracle во время переноса
  • Свои скрипты сверки на SQL и Python
  • Репликация журнала для догона изменений
Целевая СУБД
  • PostgreSQL, Postgres Pro, Tantor — по вашему выбору
  • orafce, pg_cron, pg_hint_plan — если есть в сборке
  • Полнотекстовый поиск и PostGIS вместо Oracle Text и Spatial
  • Секции, индексы, расширенная статистика
Эксплуатация
  • Patroni и потоковая репликация
  • PgBouncer
  • pgBackRest или Barman
  • Prometheus, Grafana, pg_stat_statements
Приложения и серверы
  • JDBC, ODBC и драйверы PostgreSQL
  • Смена диалекта в Hibernate, MyBatis и других слоях доступа
  • Astra Linux, РЕД ОС, Альт Linux
  • Ansible, Docker
Кому подходит

Кому подходит такой перенос

ИТ-директор или CTO со сроком

Поддержка Oracle или лицензия заканчивается. Нужен план с ценой и точками, где можно остановиться, а не презентация.

Администраторы, которых мало

Один-два администратора держат базу и не успевают ещё и переносить. Инвентаризацию и сверку берём на себя, решения остаются у вас.

Владельцы систем с Oracle внутри

ERP, биллинг, АБС: если база — часть чужой коробки, сначала выясняем у вендора, поддерживается ли PostgreSQL. Без этого переносить опасно.

Те, у кого прошлая попытка остановилась

Конвертер перенёс таблицы и встал на логике. Разбираем, где именно, и не повторяем тот же путь заново.

Заявка

Начнём с реестра объектов и запросов

Короткий созвон: версия и размер базы, сколько в ней PL/SQL, кто к ней обращается и к какому сроку нужен результат. По итогам скажем, что переносится как есть, где риски и что войдёт в обследование.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы про миграцию с Oracle на PostgreSQL

Сколько стоит миграция с Oracle на PostgreSQL?

Обследование стека и план — от 250 000 ₽, 2–3 недели; цена фиксированная и вычитается из следующего этапа. Перенос — от 800 000 ₽, итоговая сумма зависит от числа объектов PL/SQL, числа приложений и требований к отказоустойчивости. Перенос серверов на Linux считается отдельно. Точную цену называем после обследования, а не до него.

Сколько времени занимает перенос базы Oracle на PostgreSQL?

Ориентир для небольшой типовой базы — от одного до трёх месяцев вместе с параллельным периодом; при большом объёме PL/SQL и нескольких приложениях срок больше. Дольше всего идёт не загрузка данных, а перенос логики PL/SQL и правка приложений. Срок называем после обследования, когда известно число объектов и потребителей.

Можно ли перенести PL/SQL в PostgreSQL автоматически?

Частично. Инструменты вроде ora2pg переносят структуру почти целиком и дают заготовку кода, но синтаксис не равен смыслу: пакеты, автономные транзакции, иерархические запросы и обработка ошибок требуют ручной работы. Мы читаем каждый объект и сравниваем результаты на одинаковых данных. Отчёт конвертера по вашей базе сразу покажет, сколько объектов он пометил как непереносимые.

Чем заменить пакеты Oracle в PostgreSQL?

В обычном PostgreSQL прямого аналога пакета нет. Обычно пакет раскладывают на отдельную схему с функциями, а состояние пакета выносят в параметры, временные таблицы или настройки сессии. Часть встроенных пакетов DBMS_ и UTL_ имеет аналоги в расширении orafce; что именно, проверяем по списку реально вызываемых процедур.

Что будет с пустыми строками и NULL при переносе?

В Oracle пустая строка хранится как NULL, в PostgreSQL это разные значения. Данные переедут как NULL, но новый код начнёт вставлять настоящие пустые строки, и условия, уникальные ключи и проверки поведут себя иначе. Мы находим такие места в коде и решаем по каждому: нормализовать значения или изменить условие.

Нужна ли остановка работы при миграции?

Остановка записи на переключении нужна почти всегда. Её длина зависит от схемы: при догоне изменений репликацией окно меньше, при простой выгрузке и загрузке больше. Миграцию совсем без остановки мы не обещаем; длину окна записываем в регламент заранее.

Что выбрать: PostgreSQL, Postgres Pro или Tantor?

Зависит от требований к реестру российского ПО, поддержке вендора и нужным расширениям. Названия — примеры; актуальные записи в реестре, версии и условия лицензии проверяйте на дату решения. Основа переноса почти не зависит от сборки, но состав расширений и функций у сборок разный, поэтому нужные вам мы проверяем до выбора.

Как убедиться, что данные перенесены без потерь?

Сверка идёт в пять уровней: количество строк, контрольные суммы по диапазонам ключа, выборка строк с краевыми значениями, бизнес-сверка (остатки, обороты, число открытых документов) и сравнение результатов отчётов на одинаковых данных. Все расхождения объясняются письменно, протокол остаётся у вас.

Будет ли PostgreSQL медленнее Oracle?

Заранее сказать нельзя: одни запросы ускоряются, другие замедляются, потому что оптимизатор строит планы иначе, а подсказок в ядре нет. Поэтому мы снимаем профиль нагрузки до переноса, прогоняем его на PostgreSQL и до приёмки согласовываем порог по каждой ключевой операции.

Что делать с приложением, у которого нет исходников?

Сначала снять его запросы трассировкой на работающей системе, включая закрытие периода. Дальше три пути: слой совместимости между приложением и базой, доработка у вендора или решение оставить эту базу на Oracle. Какой путь честный, видно после обследования.

Можно ли вернуться на Oracle после переключения?

До открытия записи в PostgreSQL — да, это возврат подключений приложений. После — только если настроена обратная репликация или вы готовы потерять изменения, уже внесённые в новую базу. Поэтому условия отката и необходимость обратной репликации решаем и репетируем до переключения.

Как перенести Oracle, на котором стоит база 1С?

Информационную базу 1С таблицами не переносят: используют штатную выгрузку и загрузку средствами платформы 1С на другую СУБД. Порядок и поддерживаемые версии зависят от вашей версии платформы, поэтому уточняем их на обследовании.