Migration OraToPG » История » Версия 8
BEA, 11.06.2025 02:27
| 1 | 1 | BEA | h1. Миграция с Oracle на PostgreSQL |
|---|---|---|---|
| 2 | |||
| 3 | 4 | BEA | {{>toc}} |
| 4 | |||
| 5 | 1 | BEA | h2. Миграция на операционной системе Windows |
| 6 | |||
| 7 | 3 | BEA | h3. Подготовка к миграции: установка необходимого ПО |
| 8 | |||
| 9 | 1 | BEA | # Установка Perl |
| 10 | Скачайте и установите "Strawberry Perl":https://strawberryperl.com/. После установки убедитесь, что Perl добавлен в переменную среды *@PATH@*. |
||
| 11 | Проверьте установку выполнив команду: |
||
| 12 | <pre><code class="shell"> |
||
| 13 | perl -v |
||
| 14 | </code></pre> |
||
| 15 | # Установка Oracle Client. Уже описан процесс в нашей инструкции: [[OracleInstall|ссылка]] |
||
| 16 | # Установка зависимостей Perl |
||
| 17 | 3 | BEA | ## Откройте командную строку (cmd.exe) от имени администратора и выполните: |
| 18 | 1 | BEA | <pre><code class="perl"> |
| 19 | cpan DBI |
||
| 20 | cpan DBD::Oracle |
||
| 21 | cpan DBD::Pg |
||
| 22 | cpan XML::Simple |
||
| 23 | cpan DateTime |
||
| 24 | cpan JSON |
||
| 25 | cpan Term::ReadKey |
||
| 26 | cpan Test::Simple |
||
| 27 | </code></pre> |
||
| 28 | *Для установки модулей может потребоваться доступ в интернет и права администратора.* |
||
| 29 | 3 | BEA | ## Проверьте установленные зависимости при помощи команд: |
| 30 | <pre><code class="shell"> |
||
| 31 | perl -e "use DBI;" |
||
| 32 | perl -e "use DBD::Oracle;" |
||
| 33 | perl -e "use DBD::Pg;" |
||
| 34 | perl -e "use XML::Simple;" |
||
| 35 | perl -e "use DateTime;" |
||
| 36 | perl -e "use JSON;" |
||
| 37 | perl -e "use Term::ReadKey;" |
||
| 38 | perl -e "use Test::Simple;" |
||
| 39 | </code></pre> |
||
| 40 | 1 | BEA | # Установка ora2pg |
| 41 | 2 | BEA | ## 2 варианта для скачивания |
| 42 | ### Перейдите на их "оффициальный сайт":https://ora2pg.darold.net/. Найдите на сайте и перейлите по ссылке "GitHub Download v<version>". Скачиваем архив с исходниками: |
||
| 43 | !clipboard-202506060714-uwsux.png! |
||
| 44 | ### Если у вас установлен git то откройте консоль и перейдите в то местоположение куда хотите скачать. Выполните команду: |
||
| 45 | <pre><code class="shell"> |
||
| 46 | git clone https://github.com/darold/ora2pg.git |
||
| 47 | </code></pre> |
||
| 48 | ## Перейдите в папку с исходниками: |
||
| 49 | <pre><code class="shell"> |
||
| 50 | cd ora2pg |
||
| 51 | </code></pre> |
||
| 52 | Установите: |
||
| 53 | <pre><code class="shell"> |
||
| 54 | perl Makefile.PL |
||
| 55 | dmake |
||
| 56 | dmake install |
||
| 57 | </code></pre> |
||
| 58 | *Примечание:* Если dmake не найден, используйте gmake или nmake (входит в Strawberry Perl). |
||
| 59 | ## Проверка установки |
||
| 60 | <pre><code class="shell"> |
||
| 61 | ora2pg --version |
||
| 62 | </code></pre> |
||
| 63 | 1 | BEA | Если команда возвращает версию — установка прошла успешно. |
| 64 | # Скопируйте @tnsnames.ora@ из вашего рабочего клиента или сервера базы данных Oracle. Подробнее что за файл и откуда брать: [[Oracle|ссылка]] |
||
| 65 | # Проверка подключения к Oracle |
||
| 66 | 3 | BEA | ## Создайте конфигурационный файл ora2pg.conf используя файл шаблон который можно найти по пути где установлен ora2pg. |
| 67 | 1 | BEA | Пример минимальной конфигурации: |
| 68 | <pre> |
||
| 69 | # Set the Oracle home directory |
||
| 70 | 3 | BEA | ORACLE_HOME <путь ORACLE_HOME куда установлен Oracle клиент> |
| 71 | 1 | BEA | |
| 72 | # Set Oracle database connection (datasource, user, password) |
||
| 73 | ORACLE_DSN dbi:Oracle:host=<имя ПК в сети или его IP адрес>;service_name=<TNS имя вашего сервера>;port=<порт> |
||
| 74 | 3 | BEA | ORACLE_USER <имя пользователся администратора Омеги> |
| 75 | ORACLE_PWD <пароль пользователся администратора Омеги> |
||
| 76 | 1 | BEA | </pre> |
| 77 | 3 | BEA | ## Проверьте соединение с помощью команды: |
| 78 | <pre><code class="shell"> |
||
| 79 | 1 | BEA | ora2pg -t SHOW_VERSION -c /путь/к/вашему/ora2pg.conf |
| 80 | 3 | BEA | </code></pre> |
| 81 | 1 | BEA | или |
| 82 | 3 | BEA | <pre><code class="shell"> |
| 83 | ora2pg -c <путь к вашему ora2pg.conf> -e "SELECT * FROM dual;" |
||
| 84 | </code></pre> |
||
| 85 | 1 | BEA | Если соединение успешно, вы увидите ответ или версию базы данных. |
| 86 | |||
| 87 | 3 | BEA | h3. Подготовка к миграции: развёртывание PostgreSQL и приведение к одинаковой версии с Oracle |
| 88 | 1 | BEA | |
| 89 | 3 | BEA | # Установить PostgreSQL. Инструкция по установке: [[PostgreInstall|ссылка]] |
| 90 | # Произвести импорт стартовой версии БД Omega Production: |
||
| 91 | ## Дамп БД брать из нашего фтп сервера: ftp://demo:demo@internal.omp-system.ru/ServerDistr/DB/omp/dmp/postgres/omp_adm.sql |
||
| 92 | ## Рекомендуется переименовать базу данных в содержимом дампа на ту же что у вас сейчас на оракл. |
||
| 93 | То есть к примеру если у вас пользователь администратор омеги именуется как test_adm то ваша база данных именуется как test_adm. |
||
| 94 | В таком примере необходимо открыть дамп как текстовый файл и заменить по всему файлу OMP_ADM на TEST_ADM. (именно заглавными но в поиске/замене отключаем учитывание регистра) |
||
| 95 | ## Произвести импорт дампа при помощи консольных скриптов описанные в инструкции импорта/экспорта дампа: [[PostgreImportExport|ссылка]] |
||
| 96 | # Выслать отделу сопровождения текущую версию скриптов указанную в окне "О программе" внутри приложения Omega Production и написать чтобы прислали набор скриптов для обновления версии скриптов базы данных |
||
| 97 | # Проверить подключение к базе данных на устройстве на котором ранее устанавливали ora2pg |
||
| 98 | ## Используйте следующую команду для подключения: |
||
| 99 | <pre><code class="shell"> |
||
| 100 | psql -h <имя ПК в сети или его IP адрес> -p <порт> -U <пользователь> -d <имя_базы> |
||
| 101 | </code></pre> |
||
| 102 | Где: |
||
| 103 | - <пользователь> - имя пользователя администратора базы данных |
||
| 104 | - <имя_базы> - такое же как и имя пользователя администратора базы данных |
||
| 105 | При подключении вас попросят ввести пароль. |
||
| 106 | ## Проверка соединения |
||
| 107 | После успешного подключения вы увидите приглашение вида: |
||
| 108 | <pre> |
||
| 109 | <имя базы>=# |
||
| 110 | </pre> |
||
| 111 | Это означает, что соединение установлено. |
||
| 112 | ## Выполнение простых команд для проверки базы |
||
| 113 | ##* Проверка версий PostgreSQL: |
||
| 114 | <pre><code class="sql"> |
||
| 115 | SELECT version(); |
||
| 116 | </code></pre> |
||
| 117 | ##* Проверка содержимого OMP_PROPERTIES: |
||
| 118 | <pre><code class="sql"> |
||
| 119 | SELECT * FROM omp_properties op order by op.code LIMIT 10; |
||
| 120 | </code></pre> |
||
| 121 | ##* Выйти из psql: |
||
| 122 | <pre><code class="sql"> |
||
| 123 | \q |
||
| 124 | </code></pre> |
||
| 125 | # Дождаться ответа от нашего отдела сопровождения и получить набор скриптов для обновления базы данных. |
||
| 126 | ## В наборе скриптов должен присутствовать @run.bat@. Открыть его для редактирования и подправить параметры подключения к базе данных. |
||
| 127 | Содержимое данного скрипта будет из себя представлять уже ранее указанный в этой инструкции @psql ....@ |
||
| 128 | ## Дождаться конца выполнения. Проверить созданный лог на наличие ошибок. |
||
| 129 | Стандартный формат ошибок у PostgreSQL: :ERROR: на английском или :ОШИБКА: на русском в зависимости от выбранного языка при установке СУБД. |
||
| 130 | Если ошибки присутствуют то связаться с нами по вопросу их устранений |
||
| 131 | 2 | BEA | |
| 132 | 3 | BEA | *ВНИМАНИЕ: после данного этапа необходимо приостановить установку обновлений* |
| 133 | 2 | BEA | |
| 134 | 1 | BEA | h3. Миграция: выгрузка из Oracle |
| 135 | |||
| 136 | 4 | BEA | # Скачайте указанные ниже файлы из этого вики на ПК где установлен ora2pg и сложите их по одному пути: |
| 137 | 5 | BEA | #* attachment:conv_obj_attrs.cmd |
| 138 | #* attachment:ora2pg_OBJ_ATTRS_TBLS.conf |
||
| 139 | #* attachment:conv_other_tbls.cmd |
||
| 140 | #* attachment:ora2pg_OTHER_TBLS.conf |
||
| 141 | #* attachment:conv_data.cmd |
||
| 142 | #* attachment:ora2pg_DATA.conf |
||
| 143 | 3 | BEA | # Отредактируйте файлы указав свои настройки в ниже перечисленных местах |
| 144 | 5 | BEA | #* Исполняемые @.cmd@ скрипты: |
| 145 | 1 | BEA | <pre> |
| 146 | 5 | BEA | ora2pg -d -o OTHER_TBLS.pgsql -b <путь к файлам> -c <путь к файлам>\ora2pg_OTHER_TBLS.conf -l <путь к файлам>\OTHER_TBLS.log |
| 147 | </pre> |
||
| 148 | Где: |
||
| 149 | <путь к файлам> - путь куда вы скачали данные файлы. |
||
| 150 | # Файлы настроек для ora2pg. Файлы формата @.conf@ |
||
| 151 | <pre> |
||
| 152 | 3 | BEA | # Set the Oracle home directory |
| 153 | ORACLE_HOME <путь ORACLE_HOME куда установлен Oracle клиент> |
||
| 154 | |||
| 155 | # Set Oracle database connection (datasource, user, password) |
||
| 156 | ORACLE_DSN dbi:Oracle:host=<имя ПК в сети или его IP адрес>;service_name=<TNS имя вашего сервера>;port=<порт> |
||
| 157 | ORACLE_USER <имя пользователся администратора Омеги> |
||
| 158 | ORACLE_PWD <пароль пользователся администратора Омеги> |
||
| 159 | </pre> |
||
| 160 | <pre> |
||
| 161 | # Oracle schema/owner to use |
||
| 162 | 1 | BEA | SCHEMA <имя пользователя администратора> |
| 163 | </pre> |
||
| 164 | 5 | BEA | # *ВНИМАНИЕ: Если у вас есть свои таблицы внутри нашей схемы которые не заложены в поддерживаемый функционал Omega Production то этот пункт обязателен* |
| 165 | ## Открываем @ora2pg_OTHER_TBLS.conf@ и находим там длинный перечень как на скриншоте ниже: |
||
| 166 | !clipboard-202506061413-jh690.png! |
||
| 167 | ## Добавляем перечень ваших таблиц в этот список разделяя между собой проблемали |
||
| 168 | # *ВНИМАНИЕ: начиная с этого момента запуска база уже должна быть заблокирована и на ней никто в том числе пользователя администратора сидеть не должен!!!* |
||
| 169 | Запускаем @.cmd@ скрипты в порядке указанный ниже. |
||
| 170 | ## @conv_obj_attrs.cmd@ |
||
| 171 | ## @conv_other_tbls.cmd@ |
||
| 172 | ## @conv_data.cmd@ |
||
| 173 | 3 | BEA | |
| 174 | 1 | BEA | h3. Миграция: загрузка в PostgreSQL |
| 175 | |||
| 176 | 5 | BEA | В этом разделе все команды однообразны и представляют из себя запуск скриптов через psql |
| 177 | <pre><code class="shell"> |
||
| 178 | psql -h <имя ПК в сети или его IP адрес> -p <порт> -U <пользователь админимтратор омеги> -d <пользователь админимтратор омеги> -f <файл .pgsql> 1>>import_data.log 2>&1 |
||
| 179 | </code></pre> |
||
| 180 | 1 | BEA | |
| 181 | 6 | BEA | # Пустить скрипт для удаления текущих аттрибутов СО: |
| 182 | <pre><code class="sql"> |
||
| 183 | do $$ declare |
||
| 184 | r record; |
||
| 185 | begin |
||
| 186 | for r in (select tablename from pg_tables where tablename like 'obj_attr_values_%') loop |
||
| 187 | execute 'drop table if exists ' || quote_ident(r.tablename) || ' cascade'; |
||
| 188 | end loop; |
||
| 189 | end $$; |
||
| 190 | </code></pre> |
||
| 191 | 5 | BEA | # Пускаем все скрипты *кроме @DATA.pgsql@* через @psql@ как показано выше. После пуска скрипта проверяем лог на наличие ошибок (формата PostgreSQL). |
| 192 | Если не хватает какого то объекта из Оракл который не экспортировался - возвращаемся к [[#Миграция:-выгрузка-из-Oracle|Миграция: выгрузка из Oracle]] и повторяем выгрузку с включением недостающего объекта |
||
| 193 | # Скачиваем файл @data_wrap.pgsql@ на ПК где установлен ora2pg. |
||
| 194 | 6 | BEA | # Пускаем скрипт с удалением всех имеющихся данных. При повторном импорте данных этот скрипт надо пустить снова до импорта данных: |
| 195 | <pre><code class="sql"> |
||
| 196 | do $$ |
||
| 197 | DECLARE |
||
| 198 | statements CURSOR FOR |
||
| 199 | SELECT tablename FROM pg_tables |
||
| 200 | WHERE tableowner = user AND schemaname = 'public'; |
||
| 201 | BEGIN |
||
| 202 | FOR stmt IN statements LOOP |
||
| 203 | EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;'; |
||
| 204 | END LOOP; |
||
| 205 | END; |
||
| 206 | $$ LANGUAGE plpgsql; |
||
| 207 | </code></pre> |
||
| 208 | 5 | BEA | # Пускаем @data_wrap.pgsql@ через @psql@ как показано выше. После пуска скрипта проверяем лог на наличие ошибок (формата PostgreSQL). |
| 209 | Если не хватает какого то объекта из Оракл который не экспортировался - возвращаемся к [[#Миграция:-выгрузка-из-Oracle|Миграция: выгрузка из Oracle]] и повторяем выгрузку с включением недостающего объекта |
||
| 210 | |||
| 211 | h3. Миграция: функции, процедуры и прочее |
||
| 212 | |||
| 213 | Мы не производим миграцию функций, процедур и прочего по причинам: |
||
| 214 | * Оптимизация времени миграции: базовый макет БД Omega Production предоставляется заранее что позволяет меньше времени затратить на критический сегмент этого процесса где блокируется БД |
||
| 215 | 7 | BEA | * На момент того когда мы сами мигрировали БД для создания стартового макета на PostgreSQL выяснилось что утилита ora2pg не может полностью корректно конвертировать данные объекты. |
| 216 | |||
| 217 | h3. Окончание миграции: тестирование |
||
| 218 | |||
| 219 | 8 | BEA | # Специальные файлы приложения не нужны. Клиентское приложение уже работает с возможностью взаимодействовать с PostgreSQL. |
| 220 | 7 | BEA | # В файлах омеги редактируем OMP_DB.ini. Необходимо добавить строку подключения для PostgreSQL. Формат строки такой: |
| 221 | <pre> |
||
| 222 | ;Schema<порядковый номер> =<адрес сервера>:<порт>|POSTGRESQL@OMP_ADM@<Полное название для вашей базы> |
||
| 223 | </pre> |
||
| 224 | # Открываем омегу и пытаемся войти в пользователя администратора. После успешного логина в пользователя администратора проверяем логин в обычного пользователя. |
||
| 225 | Если у вас на данном этапу возникли ошибки то: |
||
| 226 | #* Если ошибка конфликт версий то это вероятнее всего значит что ошибки были допущены где то ранее. |
||
| 227 | #* Проверьте всё ли вы правильно сделали при установке PostgreSQL. Инструкция: [[PostgreInstall|ссылка]]. Особенно обратить внимание на конец инструкции где устаналиваются плагины необходимые для нашей базы данных |
||
| 228 | #* Проверьте корректно ли прописался search_path при установке PostgreSQL вот таким запросом: |
||
| 229 | <pre><code class="sql"> |
||
| 230 | select 1 from dual; |
||
| 231 | </code></pre> |
||
| 232 | 5 | BEA | Так как @dual@ в постгре по умолчанию нет он должен задействовать его из схемы oracle. Если будет ошибка что @dual@ не найден то вероятнее всего search_path прописан не корректно |