Какие проблемы возникают при миграции с Oracle
Что проверяют
Была ли у вас реальная миграция или вы знаете о ней по статьям. Интервьюер хочет услышать, что проблемы не только в синтаксисе SQL, но и в поведении базы. Следом обычно спрашивают, как вы проверяли, что после переезда данные и результаты запросов совпадают.
Как отвечать
Разложите проблемы по слоям, чаще всего речь о переезде на PostgreSQL:
- пустая строка: в Oracle
''этоNULL, в PostgreSQL это разные значения. Ломаются проверкиIS NULL, уникальные индексы и условия в коде; - типы:
DATEв Oracle хранит время (аналог в PostgreSQLtimestamp),NUMBERбез точности,CLOBиBLOBпротивtextиbytea; - PL/SQL: пакеты, автономные транзакции,
CONNECT BY,ROWNUM,DECODE,NVL, внешние соединения через(+). Это переписывается наWITH RECURSIVE,FETCH FIRST,COALESCE, а пакеты разбираются на схемы и функции; - последовательности:
seq.NEXTVALпротивnextval()или identity-колонок. В Hibernate меняется диалект, аallocationSizeобязан совпадать сINCREMENT BY; - регистр имён: Oracle приводит идентификаторы к верхнему регистру, PostgreSQL к нижнему, и имена в кавычках из нативных запросов перестают находиться;
- ошибка в транзакции: Oracle откатывает только упавший оператор, а PostgreSQL переводит всю транзакцию в состояние aborted, дальше нужен откат или
SAVEPOINT.
Со стороны Java проверьте нативные запросы в @Query(nativeQuery = true) и JdbcTemplate, вызовы процедур через CallableStatement, схему ведите в Flyway или Liquibase. Для схемы и данных есть ora2pg, для переезда с минимальным простоем используют CDC и сверку количества строк и контрольных сумм.
Где спотыкаются
Сводят всё к переписыванию синтаксиса. Самые дорогие ошибки поведенческие: пустые строки, время внутри DATE, разная реакция на ошибку в транзакции. Их не ловит ни один конвертер.
Не проверяют производительность на реальных объёмах. Хинтов в PostgreSQL из коробки нет, и запрос, который в Oracle держался на /*+ INDEX */, уходит в полный скан.
Забывают про сортировку строк: collation в PostgreSQL зависит от локали, и ORDER BY по тексту начинает давать другой порядок.