Migration OraToPG » История » Редакция 6
Редакция 5 (BEA, 06.06.2025 15:12) → Редакция 6/9 (BEA, 09.06.2025 14:43)
h1. Миграция с Oracle на PostgreSQL {{>toc}} h2. Миграция на операционной системе Windows h3. Подготовка к миграции: установка необходимого ПО # Установка Perl Скачайте и установите "Strawberry Perl":https://strawberryperl.com/. После установки убедитесь, что Perl добавлен в переменную среды *@PATH@*. Проверьте установку выполнив команду: <pre><code class="shell"> perl -v </code></pre> # Установка Oracle Client. Уже описан процесс в нашей инструкции: [[OracleInstall|ссылка]] # Установка зависимостей Perl ## Откройте командную строку (cmd.exe) от имени администратора и выполните: <pre><code class="perl"> cpan DBI cpan DBD::Oracle cpan DBD::Pg cpan XML::Simple cpan DateTime cpan JSON cpan Term::ReadKey cpan Test::Simple </code></pre> *Для установки модулей может потребоваться доступ в интернет и права администратора.* ## Проверьте установленные зависимости при помощи команд: <pre><code class="shell"> perl -e "use DBI;" perl -e "use DBD::Oracle;" perl -e "use DBD::Pg;" perl -e "use XML::Simple;" perl -e "use DateTime;" perl -e "use JSON;" perl -e "use Term::ReadKey;" perl -e "use Test::Simple;" </code></pre> # Установка ora2pg ## 2 варианта для скачивания ### Перейдите на их "оффициальный сайт":https://ora2pg.darold.net/. Найдите на сайте и перейлите по ссылке "GitHub Download v<version>". Скачиваем архив с исходниками: !clipboard-202506060714-uwsux.png! ### Если у вас установлен git то откройте консоль и перейдите в то местоположение куда хотите скачать. Выполните команду: <pre><code class="shell"> git clone https://github.com/darold/ora2pg.git </code></pre> ## Перейдите в папку с исходниками: <pre><code class="shell"> cd ora2pg </code></pre> Установите: <pre><code class="shell"> perl Makefile.PL dmake dmake install </code></pre> *Примечание:* Если dmake не найден, используйте gmake или nmake (входит в Strawberry Perl). ## Проверка установки <pre><code class="shell"> ora2pg --version </code></pre> Если команда возвращает версию — установка прошла успешно. # Скопируйте @tnsnames.ora@ из вашего рабочего клиента или сервера базы данных Oracle. Подробнее что за файл и откуда брать: [[Oracle|ссылка]] # Проверка подключения к Oracle ## Создайте конфигурационный файл ora2pg.conf используя файл шаблон который можно найти по пути где установлен ora2pg. Пример минимальной конфигурации: <pre> # Set the Oracle home directory ORACLE_HOME <путь ORACLE_HOME куда установлен Oracle клиент> # Set Oracle database connection (datasource, user, password) ORACLE_DSN dbi:Oracle:host=<имя ПК в сети или его IP адрес>;service_name=<TNS имя вашего сервера>;port=<порт> ORACLE_USER <имя пользователся администратора Омеги> ORACLE_PWD <пароль пользователся администратора Омеги> </pre> ## Проверьте соединение с помощью команды: <pre><code class="shell"> ora2pg -t SHOW_VERSION -c /путь/к/вашему/ora2pg.conf </code></pre> или <pre><code class="shell"> ora2pg -c <путь к вашему ora2pg.conf> -e "SELECT * FROM dual;" </code></pre> Если соединение успешно, вы увидите ответ или версию базы данных. h3. Подготовка к миграции: развёртывание PostgreSQL и приведение к одинаковой версии с Oracle # Установить PostgreSQL. Инструкция по установке: [[PostgreInstall|ссылка]] # Произвести импорт стартовой версии БД Omega Production: ## Дамп БД брать из нашего фтп сервера: ftp://demo:demo@internal.omp-system.ru/ServerDistr/DB/omp/dmp/postgres/omp_adm.sql ## Рекомендуется переименовать базу данных в содержимом дампа на ту же что у вас сейчас на оракл. То есть к примеру если у вас пользователь администратор омеги именуется как test_adm то ваша база данных именуется как test_adm. В таком примере необходимо открыть дамп как текстовый файл и заменить по всему файлу OMP_ADM на TEST_ADM. (именно заглавными но в поиске/замене отключаем учитывание регистра) ## Произвести импорт дампа при помощи консольных скриптов описанные в инструкции импорта/экспорта дампа: [[PostgreImportExport|ссылка]] # Выслать отделу сопровождения текущую версию скриптов указанную в окне "О программе" внутри приложения Omega Production и написать чтобы прислали набор скриптов для обновления версии скриптов базы данных # Проверить подключение к базе данных на устройстве на котором ранее устанавливали ora2pg ## Используйте следующую команду для подключения: <pre><code class="shell"> psql -h <имя ПК в сети или его IP адрес> -p <порт> -U <пользователь> -d <имя_базы> </code></pre> Где: - <пользователь> - имя пользователя администратора базы данных - <имя_базы> - такое же как и имя пользователя администратора базы данных При подключении вас попросят ввести пароль. ## Проверка соединения После успешного подключения вы увидите приглашение вида: <pre> <имя базы>=# </pre> Это означает, что соединение установлено. ## Выполнение простых команд для проверки базы ##* Проверка версий PostgreSQL: <pre><code class="sql"> SELECT version(); </code></pre> ##* Проверка содержимого OMP_PROPERTIES: <pre><code class="sql"> SELECT * FROM omp_properties op order by op.code LIMIT 10; </code></pre> ##* Выйти из psql: <pre><code class="sql"> \q </code></pre> # Дождаться ответа от нашего отдела сопровождения и получить набор скриптов для обновления базы данных. ## В наборе скриптов должен присутствовать @run.bat@. Открыть его для редактирования и подправить параметры подключения к базе данных. Содержимое данного скрипта будет из себя представлять уже ранее указанный в этой инструкции @psql ....@ ## Дождаться конца выполнения. Проверить созданный лог на наличие ошибок. Стандартный формат ошибок у PostgreSQL: :ERROR: на английском или :ОШИБКА: на русском в зависимости от выбранного языка при установке СУБД. Если ошибки присутствуют то связаться с нами по вопросу их устранений *ВНИМАНИЕ: после данного этапа необходимо приостановить установку обновлений* h3. Миграция: выгрузка из Oracle # Скачайте указанные ниже файлы из этого вики на ПК где установлен ora2pg и сложите их по одному пути: #* attachment:conv_obj_attrs.cmd #* attachment:ora2pg_OBJ_ATTRS_TBLS.conf #* attachment:conv_other_tbls.cmd #* attachment:ora2pg_OTHER_TBLS.conf #* attachment:conv_data.cmd #* attachment:ora2pg_DATA.conf # Отредактируйте файлы указав свои настройки в ниже перечисленных местах #* Исполняемые @.cmd@ скрипты: <pre> ora2pg -d -o OTHER_TBLS.pgsql -b <путь к файлам> -c <путь к файлам>\ora2pg_OTHER_TBLS.conf -l <путь к файлам>\OTHER_TBLS.log </pre> Где: <путь к файлам> - путь куда вы скачали данные файлы. # Файлы настроек для ora2pg. Файлы формата @.conf@ <pre> # Set the Oracle home directory ORACLE_HOME <путь ORACLE_HOME куда установлен Oracle клиент> # Set Oracle database connection (datasource, user, password) ORACLE_DSN dbi:Oracle:host=<имя ПК в сети или его IP адрес>;service_name=<TNS имя вашего сервера>;port=<порт> ORACLE_USER <имя пользователся администратора Омеги> ORACLE_PWD <пароль пользователся администратора Омеги> </pre> <pre> # Oracle schema/owner to use SCHEMA <имя пользователя администратора> </pre> # *ВНИМАНИЕ: Если у вас есть свои таблицы внутри нашей схемы которые не заложены в поддерживаемый функционал Omega Production то этот пункт обязателен* ## Открываем @ora2pg_OTHER_TBLS.conf@ и находим там длинный перечень как на скриншоте ниже: !clipboard-202506061413-jh690.png! ## Добавляем перечень ваших таблиц в этот список разделяя между собой проблемали # *ВНИМАНИЕ: начиная с этого момента запуска база уже должна быть заблокирована и на ней никто в том числе пользователя администратора сидеть не должен!!!* Запускаем @.cmd@ скрипты в порядке указанный ниже. ## @conv_obj_attrs.cmd@ ## @conv_other_tbls.cmd@ ## @conv_data.cmd@ h3. Миграция: загрузка в PostgreSQL В этом разделе все команды однообразны и представляют из себя запуск скриптов через psql <pre><code class="shell"> psql -h <имя ПК в сети или его IP адрес> -p <порт> -U <пользователь админимтратор омеги> -d <пользователь админимтратор омеги> -f <файл .pgsql> 1>>import_data.log 2>&1 </code></pre> # Пустить скрипт для удаления текущих аттрибутов СО: <pre><code class="sql"> do $$ declare r record; begin for r in (select tablename from pg_tables where tablename like 'obj_attr_values_%') loop execute 'drop table if exists ' || quote_ident(r.tablename) || ' cascade'; end loop; end $$; </code></pre> # Пускаем все скрипты *кроме @DATA.pgsql@* через @psql@ как показано выше. После пуска скрипта проверяем лог на наличие ошибок (формата PostgreSQL). Если не хватает какого то объекта из Оракл который не экспортировался - возвращаемся к [[#Миграция:-выгрузка-из-Oracle|Миграция: выгрузка из Oracle]] и повторяем выгрузку с включением недостающего объекта # Скачиваем файл @data_wrap.pgsql@ на ПК где установлен ora2pg. # Пускаем скрипт с удалением всех имеющихся данных. При повторном импорте данных этот скрипт надо пустить снова до импорта данных: <pre><code class="sql"> do $$ DECLARE statements CURSOR FOR SELECT tablename FROM pg_tables WHERE tableowner = user AND schemaname = 'public'; BEGIN FOR stmt IN statements LOOP EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;'; END LOOP; END; $$ LANGUAGE plpgsql; </code></pre> # Пускаем @data_wrap.pgsql@ через @psql@ как показано выше. После пуска скрипта проверяем лог на наличие ошибок (формата PostgreSQL). Если не хватает какого то объекта из Оракл который не экспортировался - возвращаемся к [[#Миграция:-выгрузка-из-Oracle|Миграция: выгрузка из Oracle]] и повторяем выгрузку с включением недостающего объекта h3. Миграция: функции, процедуры и прочее Мы не производим миграцию функций, процедур и прочего по причинам: * Оптимизация времени миграции: базовый макет БД Omega Production предоставляется заранее что позволяет меньше времени затратить на критический сегмент этого процесса где блокируется БД * На момент того когда мы сами мигрировали БД для создания стартового макета на POstgreSQL утилита ora2pg не может полностью корректно конвертировать данные объекты. Если возникнут сложности — пишите нам. Поможем