Проект

Общее

Профиль

Migration OraToPG » История » Версия 12

BEA, 01.10.2025 17:14

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