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