Сложная миграция с Oracle на Postgres. Глава 4.
#Oracle #Postgres #ora2pg #миграция #легаси
Итак, на текущем этапе мы столкнулись с необходимостью реализации миграции в один приём, используя утилиту, которая запускается многократно, копируя данные волнами, чтобы обеспечить связность.
Задача усложняется тем, что требуется на лету добавлять и видоизменять некоторые поля в определённых таблицах.
Настроечный файл утилиты предоставляет множество возможностей, включая динамическое преобразование имён столбцов и таблиц. Однако этого недостаточно для изменения самих данных.
Было принято решение создать в Oracle слой представлений (view), которые будут структурно идентичны целевым таблицам Postgres. Это позволяет использовать весь функционал SQL для преобразований, не занимая дополнительного места и обеспечивая наглядность и поддержку.
Мы приступили к созданию ETL-слоя. Для каждой таблицы был создан двойник в виде подготовленного представления, где генерировалось значение для поля партиции и вносились преобразования в форматы, включая хранение дат.
Одной из сложностей, с которыми мы столкнулись при работе с датами, стало перебазирование часового пояса. Это редкая задача, но в документации Oracle есть функции для её решения.
Однако даты и время хранились не в timestamp, а в виде строки собственного формата. Пришлось разработать алгоритм распознавания строки, выделения части, где хранится смещение относительно исходного часового пояса, изменения его на 3 часа и обратной сборки. Особую сложность представляло то, что смещение могло быть не целым числом, например +02:00 от Гринвича, а с минутами, и даже отрицательным, например -12:45.
Встроенные функции Oracle не смогли справиться с этой задачей (плюс версия Oracle не поддерживала необходимые функции), поэтому пришлось реализовать арифметику смещения прямо в расчёте этого атрибута. В итоге непрерывная строка с этой формулой заняла 3 экранные строки, около 700 символов.
Вью были готовы и отлажены, все данные подготовлены в соответствии с ожиданиями Postgres, настроечные файлы дополнены подменой имён сущностей, чтобы данные копировались из вью в таблицы.
На тестовом стенде всё работало штатно, и мы перешли на стенд ПСИ, где были данные нагрузочного тестирования.
Однако всё стало работать невероятно долго. Даже одна таблица копировалась часами. Задача по бесшовному переключению стала казаться невыполнимой.
Как мы решили этот вопрос — читайте в следующей главе.