<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8%D0%B7_Oracle_%D0%B2_PostgreSQL</id>
		<title>Миграция данных из Oracle в PostgreSQL - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8%D0%B7_Oracle_%D0%B2_PostgreSQL"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%9C%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8%D0%B7_Oracle_%D0%B2_PostgreSQL&amp;action=history"/>
		<updated>2026-05-14T09:45:27Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=%D0%9C%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8%D0%B7_Oracle_%D0%B2_PostgreSQL&amp;diff=43661&amp;oldid=prev</id>
		<title>KseniyaKirillova: Новая страница: «&lt;blockquote&gt;''Максим Трегубов, наш&amp;nbsp;ведущий системный и…»</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%9C%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8%D0%B7_Oracle_%D0%B2_PostgreSQL&amp;diff=43661&amp;oldid=prev"/>
				<updated>2015-07-15T10:22:27Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&lt;a href=&quot;/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%A2%D1%80%D0%B5%D0%B3%D1%83%D0%B1%D0%BE%D0%B2_(%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8)&quot; title=&quot;Категория:Максим Трегубов (Статьи)&quot;&gt;Максим Трегубов&lt;/a&gt;, наш ведущий системный и…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;''[[:Категория:Максим Трегубов (Статьи)|Максим Трегубов]], наш&amp;amp;nbsp;ведущий системный инженер, поделился техническими подробностями миграции данных из&amp;amp;nbsp;СУБД&amp;amp;nbsp;Oracle в&amp;amp;nbsp;Postgres в&amp;amp;nbsp;блоге компании на&amp;amp;nbsp;[http://habrahabr.ru/ «Хабрахабре»]. Какой инструмент для&amp;amp;nbsp;миграции использовался нашими специалистами? Каким образом установить и&amp;amp;nbsp;настроить окружение для&amp;amp;nbsp;перевода? И&amp;amp;nbsp;какие трудности могут возникнуть в&amp;amp;nbsp;процессе миграции? Ответы на&amp;amp;nbsp;эти и&amp;amp;nbsp;другие вопросы&amp;amp;nbsp;— в&amp;amp;nbsp;материале [http://habrahabr.ru/company/custis/blog/262605/ «Миграция данных из&amp;amp;nbsp;Oracle в&amp;amp;nbsp;PostgreSQL»] на&amp;amp;nbsp;сайте.''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
«Ландшафт» СУБД в&amp;amp;nbsp;проектах нашей компании до&amp;amp;nbsp;недавнего времени выглядел так: большую часть составляла Oracle, существенно меньшие&amp;amp;nbsp;— MS&amp;amp;nbsp;SQL и&amp;amp;nbsp;MySQL.&lt;br /&gt;
&lt;br /&gt;
Но, как известно, нет ничего вечного, и&amp;amp;nbsp;недавно к&amp;amp;nbsp;нам поступил запрос о&amp;amp;nbsp;применимости Postgres в&amp;amp;nbsp;одном из&amp;amp;nbsp;наших проектов. К&amp;amp;nbsp;этой&amp;amp;nbsp;СУБД мы присматривались в&amp;amp;nbsp;последние пару лет очень пристально&amp;amp;nbsp;— посещали конференции, meetup’ы, но&amp;amp;nbsp;вот попробовать ее в&amp;amp;nbsp;«боевых» условиях до&amp;amp;nbsp;недавнего времени не&amp;amp;nbsp;доводилось.&lt;br /&gt;
&lt;br /&gt;
==Итак, задача==&lt;br /&gt;
&lt;br /&gt;
Дано: сервер Oracle (single instance) 11.2.0.3 и&amp;amp;nbsp;набор не&amp;amp;nbsp;связанных друг с&amp;amp;nbsp;другом схем общим объемом ~&amp;amp;nbsp;50GB. Необходимо: перенести данные, индексы, первичные и&amp;amp;nbsp;ссылочные ключи из&amp;amp;nbsp;Oracle в&amp;amp;nbsp;Postgres.&lt;br /&gt;
&lt;br /&gt;
==Выбор инструмента миграции==&lt;br /&gt;
&lt;br /&gt;
Обзор инструментария для&amp;amp;nbsp;миграции показал наличие как&amp;amp;nbsp;коммерческих инструментов, таких как&amp;amp;nbsp;Enterprise DB&amp;amp;nbsp;Migration Toolkit и&amp;amp;nbsp;Oracle Golden Gate, так и&amp;amp;nbsp;свободного&amp;amp;nbsp;ПО. Перевод был запланирован однократный, поэтому требовалось зрелое средство, вместе с&amp;amp;nbsp;тем понятное и&amp;amp;nbsp;простое. Кроме того, конечно, учитывался и&amp;amp;nbsp;вопрос стоимости. Из&amp;amp;nbsp;свободного&amp;amp;nbsp;ПО наиболее зрелым на&amp;amp;nbsp;сегодняшний день является проект Ora2Pg Жиля Дарольда (Darold Gill), он же во&amp;amp;nbsp;многом превзошел по&amp;amp;nbsp;функционалу и&amp;amp;nbsp;коммерческие варианты. Преимущества, склонившие чашу весов в&amp;amp;nbsp;его сторону:&lt;br /&gt;
* богатый функционал;&lt;br /&gt;
* активное развитие проекта (15&amp;amp;nbsp;лет разработки, 15&amp;amp;nbsp;мажорных релизов).&lt;br /&gt;
&lt;br /&gt;
Принцип работы утилиты командной строки Ora2Pg довольно прост: она соединяется с&amp;amp;nbsp;БД&amp;amp;nbsp;Oracle, сканирует указанную в&amp;amp;nbsp;файле конфигурации схему и&amp;amp;nbsp;выгружает объекты схемы в&amp;amp;nbsp;виде DDL-инструкций в&amp;amp;nbsp;sql-файлы. Сами данные можно как выгрузить в&amp;amp;nbsp;виде INSERT’ов в&amp;amp;nbsp;sql-файл, так и&amp;amp;nbsp;вставить напрямую в&amp;amp;nbsp;созданные таблицы СУБД&amp;amp;nbsp;Postgres.&lt;br /&gt;
&lt;br /&gt;
==Установка и настройка окружения==&lt;br /&gt;
&lt;br /&gt;
В&amp;amp;nbsp;компании мы используем подход DevOps для&amp;amp;nbsp;создания виртуальных машин, установки необходимого софта, конфигурирования и&amp;amp;nbsp;развертывания&amp;amp;nbsp;ПО. Наш рабочий инструмент&amp;amp;nbsp;— Ansible. Но для того, чтобы облегчить восприятие и&amp;amp;nbsp;не&amp;amp;nbsp;вводить в&amp;amp;nbsp;статью новые сущности, к&amp;amp;nbsp;делу не&amp;amp;nbsp;относящиеся, далее мы будем показывать ручные действия из&amp;amp;nbsp;командной строки. Для тех, кому интересно, мы выкладываем Ansible playbook для&amp;amp;nbsp;всех шагов [https://github.com/CUSTIS-public/ansible-postgresql здесь].&lt;br /&gt;
&lt;br /&gt;
Итак, на&amp;amp;nbsp;виртуальной машине с&amp;amp;nbsp;OS&amp;amp;nbsp;Centos&amp;amp;nbsp;6.6 выполним следующие шаги.&lt;br /&gt;
# Установим репозиторий Postgres.&lt;br /&gt;
# Установим Postgres&amp;amp;nbsp;9.4 сервер.&lt;br /&gt;
# Создадим БД и&amp;amp;nbsp;настроим доступ.&lt;br /&gt;
# Установим Postgres как&amp;amp;nbsp;сервис и&amp;amp;nbsp;запустим его.&lt;br /&gt;
# Установим instant клиент Oracle.&lt;br /&gt;
# Установим утилиту Ora2Pg.&lt;br /&gt;
&lt;br /&gt;
Все дальнейшие действия будут производится из-под учетной записи &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;. Установим репозиторий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;а&amp;lt;/span&amp;gt;#yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Установим Postgres&amp;amp;nbsp;9.4:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;а&amp;lt;/span&amp;gt;#yum install postgresql94-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим кластер Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;а&amp;lt;/span&amp;gt;#service postgresql-9.4 initdb&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройка доступа сводится к&amp;amp;nbsp;тому, что мы специально понижаем безопасность соединения Postgres для&amp;amp;nbsp;удобства тестирования. Конечно, в&amp;amp;nbsp;продакшн-среде мы не&amp;amp;nbsp;рекомендуем так делать.&lt;br /&gt;
&lt;br /&gt;
В&amp;amp;nbsp;файле &amp;lt;code&amp;gt;/var/lib/pgsql/9.4/data/postgresql.conf&amp;lt;/code&amp;gt; необходимо раскомментировать строчку &amp;lt;code&amp;gt;listen_addresses = '*'&amp;lt;/code&amp;gt;. В&amp;amp;nbsp;файле &amp;lt;code&amp;gt;/var/lib/pgsql/9.4/data/pg_hba.conf&amp;lt;/code&amp;gt; для&amp;amp;nbsp;локальных и&amp;amp;nbsp;удаленных соединений необходимо поставить метод &amp;lt;code&amp;gt;trust&amp;lt;/code&amp;gt;. Секция после редактирования выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     # TYPE DATABASE USER ADDRESS METHOD&lt;br /&gt;
     # &amp;quot;local&amp;quot; is for Unix domain socket connections only&lt;br /&gt;
     local all all trust&lt;br /&gt;
     # IPv4 local connections:&lt;br /&gt;
     host all all all trust&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Зарегистрируем Postgres как&amp;amp;nbsp;сервис и&amp;amp;nbsp;запустим его:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     #chkconfig postgresql-9.4 on&lt;br /&gt;
     #service postgresql-9.4 restart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для&amp;amp;nbsp;установки Oracle instant client необходимо загрузить с&amp;amp;nbsp;OTN следующие пакеты:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Установим их:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#yum install /tmp/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#yum install /tmp/oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#yum install /tmp/oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#yum install /tmp/oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим папку для&amp;amp;nbsp;&amp;lt;code&amp;gt;tnsnames.ora&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#mkdir -p /usr/lib/oracle/11.2/client64/network/admin&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#chmod 755 /usr/lib/oracle/11.2/client64/network/admin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Установим следующие переменные окружения (в &amp;lt;code&amp;gt;.bash_profile&amp;lt;/code&amp;gt; пользователя):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     export ORACLE_HOME=/usr/lib/oracle/11.2/client64&lt;br /&gt;
     export PATH=$PATH:$ORACLE_HOME/bin&lt;br /&gt;
     export LD_LIBRARY_PATH=$ORACLE_HOME/lib&lt;br /&gt;
     export TNS_ADMIN=$ORACLE_HOME/network/admin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И&amp;amp;nbsp;проверим работоспособность.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     sqlplus system/&amp;lt;you_password_here&amp;gt;@host.domain.ru/SERVICE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все ок — то получим примерно такой вывод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     Connected to:&lt;br /&gt;
     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production&lt;br /&gt;
     With the Partitioning, OLAP, Data Mining and Real Application Testing options&lt;br /&gt;
     SQL&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остался последний шаг настройки&amp;amp;nbsp;— установка Оra2pg. Скачиваем с&amp;amp;nbsp;[http://ora2pg.darold.net/config.html сайта] последнюю версию Ora2Pg (на&amp;amp;nbsp;момент написания статьи была версия 15.2). Установим необходимые пакеты:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#yum install gcc cpan postgresql94-plperl postgresql94-devel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Установим модуль CPan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#cpan&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Установим дополнительные модули для&amp;amp;nbsp;Perl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#cpan Test::Simple DBI Time::HiRes DBD::Oracle DBD::Pg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Распакуем Ora2pg в,&amp;amp;nbsp;скажем, &amp;lt;code&amp;gt;/install&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#cd /install&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#tar -xvf ora2pg-15.2.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Соберем Ora2pg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#perl Makefile.PL&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#make&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#make install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Миграция==&lt;br /&gt;
&lt;br /&gt;
СУБД Postgres по&amp;amp;nbsp;«духу» наиболее близка к&amp;amp;nbsp;Oracle. В&amp;amp;nbsp;обеих хорошо соотносятся типы данных, и&amp;amp;nbsp;там, и&amp;amp;nbsp;там есть такое понятие, как схема. Воспользуемся этим и&amp;amp;nbsp;будем переносить данные «посхемно». Процесс миграции будет состоять из&amp;amp;nbsp;следующих шагов:&lt;br /&gt;
# Создание проекта миграции с&amp;amp;nbsp;помощью Оra2pg.&lt;br /&gt;
# Правка файла конфигурации ora2pg.conf.&lt;br /&gt;
# Выгрузка DDL таблиц, индексов, constraints из&amp;amp;nbsp;Oracle.&lt;br /&gt;
# Создание БД в&amp;amp;nbsp;Postgres.&lt;br /&gt;
# Импорт DDL&amp;amp;nbsp;таблиц, подготовленный на&amp;amp;nbsp;3-м&amp;amp;nbsp;шаге.&lt;br /&gt;
# Копирование данных.&lt;br /&gt;
# Импорт DDL индексов и&amp;amp;nbsp;constraints.&lt;br /&gt;
&lt;br /&gt;
Все последующие действия будем выполнять от&amp;amp;nbsp;пользователя &amp;lt;code&amp;gt;postgres&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:#ffffff&amp;quot;&amp;gt;f&amp;lt;/span&amp;gt;#su -l postgres&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим проект миграции. Проект состоит из&amp;amp;nbsp;набора папок &amp;lt;code&amp;gt;tables/functions/views/packages&amp;lt;/code&amp;gt;, в&amp;amp;nbsp;которых будут находится sql-файлы с&amp;amp;nbsp;DDL&amp;amp;nbsp;соответствующих объектов, конфигурационного файла ora2pg.conf и&amp;amp;nbsp;скрипта запуска&amp;amp;nbsp;— &amp;lt;code&amp;gt;export_schema.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ora2pg --init_project my_project_name&lt;br /&gt;
     $cd my_project_home&lt;br /&gt;
     $vi config/ora2pg.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Конфигурирование==&lt;br /&gt;
 &lt;br /&gt;
Файл конфигурации Ora2pg довольно объемен, и&amp;amp;nbsp;я&amp;amp;nbsp;остановлюсь только на&amp;amp;nbsp;тех параметрах, которые являются корневыми или&amp;amp;nbsp;потребовались во&amp;amp;nbsp;время миграции наших данных. Про остальные я рекомендую узнать из&amp;amp;nbsp;[http://ora2pg.darold.net/config.html этой статьи].&lt;br /&gt;
&lt;br /&gt;
Секция, описывающая параметры соединения c&amp;amp;nbsp;БД&amp;amp;nbsp;Oracle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     ORACLE_HOME /usr/lib/oracle/11.2/client64&lt;br /&gt;
     ORACLE_DSN dbi:Oracle:host=oracle_host.domain.ru;sid=&amp;lt;SID&amp;gt;&lt;br /&gt;
     ORACLE_USER SYSTEM&lt;br /&gt;
     ORACLE_PWD MANAGER&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция, описывающая, какую схему выгружаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     EXPORT_SCHEMA 1&lt;br /&gt;
     SCHEMA TST_OWNER&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И&amp;amp;nbsp;указание, в&amp;amp;nbsp;какую схему загружаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     PG_SCHEMA tst_owner&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указываем тип экспорта. Параметр &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; говорит о&amp;amp;nbsp;том, что мы будем копировать данные напрямую из&amp;amp;nbsp;Oracle в&amp;amp;nbsp;Postgres, минуя текстовый файл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     TYPE TABLE,COPY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция, описывающая параметры соединения c&amp;amp;nbsp;БД&amp;amp;nbsp;Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     PG_DSN dbi:Pg:dbname=qqq;host=localhost;port=5432&lt;br /&gt;
     PG_USER tst_owner&lt;br /&gt;
     PG_PWD tst_onwer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция конвертации типов данных. Для того, чтобы тип &amp;lt;code&amp;gt;number()&amp;lt;/code&amp;gt; без&amp;amp;nbsp;указания точности не&amp;amp;nbsp;конвертировался в&amp;amp;nbsp;&amp;lt;code&amp;gt;bigint&amp;lt;/code&amp;gt;, укажем:&lt;br /&gt;
     &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     DEFAULT_NUMERIC numeric&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На&amp;amp;nbsp;этом конфигурационные шаги закончены, и&amp;amp;nbsp;мы готовы приступить к&amp;amp;nbsp;переносу. Выгрузим описания схемы в&amp;amp;nbsp;виде набора sql-файлов c&amp;amp;nbsp;DDL&amp;amp;nbsp;объектов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $./export_schema.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим базу данных &amp;lt;code&amp;gt;qqq&amp;lt;/code&amp;gt;, пользователя &amp;lt;code&amp;gt;test_owner&amp;lt;/code&amp;gt; и&amp;amp;nbsp;выдадим необходимые права.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $psql &lt;br /&gt;
     postgres=#create database qqq;&lt;br /&gt;
     CREATE DATABASE&lt;br /&gt;
     postgres=#create user test_owner password ‘test_owner’;&lt;br /&gt;
     CREATE ROLE&lt;br /&gt;
     postgres=#grant all on database qqq to test_owner;&lt;br /&gt;
     GRANT&lt;br /&gt;
     postgres=#\q&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выполним импорт sql-файла c&amp;amp;nbsp;DDL&amp;amp;nbsp;таблиц:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $psql -d qqq -U test_owner &amp;lt; schema/tables/table.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь все готово к&amp;amp;nbsp;копированию данных. Запускаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несмотря на&amp;amp;nbsp;тот факт, что в&amp;amp;nbsp;командной строке мы указываем параметр &amp;lt;code&amp;gt;-о&amp;lt;/code&amp;gt; с&amp;amp;nbsp;именем файла, в&amp;amp;nbsp;который следует сохранять выгрузку, вставка данных происходит напрямую из&amp;amp;nbsp;Oracle в&amp;amp;nbsp;Postgres. В&amp;amp;nbsp;нашем случае скорость вставки была около 6&amp;amp;nbsp;тыс.&amp;amp;nbsp;строк в&amp;amp;nbsp;секунду, но&amp;amp;nbsp;это, конечно&amp;amp;nbsp;же, зависит от&amp;amp;nbsp;типов копируемых данных и&amp;amp;nbsp;окружающей инфраструктуры.&lt;br /&gt;
&lt;br /&gt;
Остался последний шаг&amp;amp;nbsp;— создать индексы и&amp;amp;nbsp;constraints.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $psql -d qqq -U test_owner &amp;lt; schema/tables/INDEXES_table.sql&lt;br /&gt;
     $psql -d qqq -U test_owner &amp;lt; schema/tables/CONSTRAINTS_table.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в&amp;amp;nbsp;процессе выполнения предыдущих команд вы не&amp;amp;nbsp;получили ошибок&amp;amp;nbsp;— поздравляю, миграция прошла успешно! Но, как&amp;amp;nbsp;известно из&amp;amp;nbsp;закона Мёрфи: &amp;quot;Anything that can go&amp;amp;nbsp;wrong will go&amp;amp;nbsp;wrong&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Наши подводные камни==&lt;br /&gt;
&lt;br /&gt;
Первый подводный камень уже был упомянут выше: тип &amp;lt;code&amp;gt;number()&amp;lt;/code&amp;gt; без&amp;amp;nbsp;указания точности конвертируется в&amp;amp;nbsp;&amp;lt;code&amp;gt;bigint&amp;lt;/code&amp;gt;, но&amp;amp;nbsp;это легко исправить правильной конфигурацией.&lt;br /&gt;
&lt;br /&gt;
Следующей сложностью оказалось то, что в&amp;amp;nbsp;Postgres нет&amp;amp;nbsp;типа, аналогичного &amp;lt;code&amp;gt;Oracle anydata&amp;lt;/code&amp;gt;. В&amp;amp;nbsp;связи с&amp;amp;nbsp;этим мы были вынуждены, проанализировав и&amp;amp;nbsp;поправив логику приложения, в&amp;amp;nbsp;ущерб гибкости сконвертировать его в&amp;amp;nbsp;«подходящие» типы. Например, в&amp;amp;nbsp;&amp;lt;code&amp;gt;varchar2(100)&amp;lt;/code&amp;gt;. Кроме того, если у&amp;amp;nbsp;вас есть какие-то кастомные типы, то&amp;amp;nbsp;все придется переделывать, поскольку они не&amp;amp;nbsp;транслируются, но&amp;amp;nbsp;это тема как минимум для&amp;amp;nbsp;отдельной статьи.&lt;br /&gt;
&lt;br /&gt;
==Подведем итоги==&lt;br /&gt;
&lt;br /&gt;
Утилита Ora2Pg, несмотря на&amp;amp;nbsp;сложность настройки, проста и&amp;amp;nbsp;надежна в&amp;amp;nbsp;использовании. Ее смело можно рекомендовать для&amp;amp;nbsp;миграции небольших и&amp;amp;nbsp;средних&amp;amp;nbsp;БД. Кстати, ее автор на&amp;amp;nbsp;PGConf Russia объявил о&amp;amp;nbsp;том, что начинает проект&amp;amp;nbsp;MS2Pg. Звучит многообещающе.&lt;br /&gt;
&lt;br /&gt;
Удачных миграций!&lt;br /&gt;
&lt;br /&gt;
[[Категория:Максим Трегубов (Статьи)]]&lt;br /&gt;
[[Категория:Хабрахабр (Публикации)]]&lt;br /&gt;
[[Категория:2015 год (Статьи)]]&lt;br /&gt;
[[Категория:CustisWikiToLib]]&lt;/div&gt;</summary>
		<author><name>KseniyaKirillova</name></author>	</entry>

	</feed>