はじめに
こんにちは!
株式会社BFT名古屋支店・新卒の「なる」と「もな」です!
今回はOra2pgを用いたデータベースの移行に挑戦しました!
行った手順を以下の3ステップで、全2回の記事に分けてご紹介したいと思います。
① Ora2pg構築
② Oracleデータベースからのデータエクスポート
③ Postgresデータベースへのデータインポート
こちらの記事(前半)では①について書いていきます。
OracleやMySQLデータベースを PostgreSQLに移行するための無料ツールです。
OracleやMySQLからDDL等のデータをエクスポートし、PostgreSQLにデータ等をインポートすることでデータベースを移行することができます。
詳しくはこちらを参照してください。
https://ora2pg.darold.net/(公式サイト)
検証の背景と構成図
今回は"既存のオンプレ環境のOracleDB"から"クラウド(Azure)環境のPostgresDB(PaaS)"への移行を想定して以下のような構成で検証を行いました。

本来はオンプレ環境で用意して検証したいところでしたが、そのために必要なExpressRoute(Azureが提供しているオンプレ-クラウド間の通信サービス)は用意に手間がかかる&費用も高額なため、AzureVMにインストールしたOracleを使用しました。
※2 Ora2pgのインストール先について一般的にはOracleDB用サーバやPostgresDB用サーバに同居させる構成もあるかと思いますが、今回は
- OracleDB用サーバ…現在稼働中のものを使用するためいじりたくない
- PostgresDB用サーバ…PaaSを使用するため他のアプリケーションを同居させることができない
OracleDB用サーバとOra2pg用サーバは、本番環境に合わせてプライベート(インターネット接続ができない)VNet内に作成しました。 このため、こちらの記事で紹介するOra2pgインストール手順はオフラインでの作業を前提としています。
また、今回Ora2pgサーバをオフラインで構築するにあたって依存パッケージをインストールする際にインターネット接続可能な仮想マシンを1台使用しています。手順を参考にされる場合は、その点ご了承ください。
オフラインインストールの手順については、詳しく説明した記事がありますのでぜひ参考にしてください。
Ora2pgサーバ構築の流れ
まず、Ora2pgサーバ構築全体の流れとこの記事で対象とする作業範囲について説明します。

【RHEL, yumオフラインインストール】オフラインで依存関係解決しながらパッケージインストールなんて地獄(近日公開)
※2 Oracle Instant Clientはダウンロードするのにアカウント登録が必要であり、インターネット接続可能な仮想マシンでダウンロードすることができないため、今回はローカルPCでダウンロードしてOra2pgサーバに転送します。
1. インターネット接続可能な仮想マシンに依存パッケージ(gcc, perl-CPAN)をダウンロードする
2. インターネット接続可能な仮想マシンでリポジトリを作成し、ローカルPCに転送する
3. ローカルPCにOra2pgと依存パッケージ(Oracle Instant Client, perlモジュール)をダウンロードする
4. Ora2pgとリポジトリ、依存パッケージ(Oracle Instant Client, perlモジュール)をローカルPCからOra2pgサーバに転送する
5.Ora2pgサーバに依存パッケージ(gcc, perl-CPAN, Oracle Instant Client, perlモジュール)をインストールする
6. Ora2pgをインストールする
この記事では4~6の手順について詳しくまとめています(3は事前準備となります。繰り返しになりますが1,2の手順については別の記事で紹介しておりますので、そちらをぜひ参考にしてください)。
使用環境
- Azure VM
- イメージ:Red Hat Enterprise Linux 7.4 -Gen1
- VMサイズ:Standard DS1 v2
- Ora2pgバージョン:23.1
使用パッケージ一覧
- ora2pg-23.1.tar.gz
- oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm
- DBI-1.643.tar.gz
- DBD-Oracle-1.83.tar.gz
- gcc-4.8.5-44.el7.x86_64.rpm
- perl-CPAN-1.9800-299.el7_9.noarch.rpm
前提条件
- Oracleサーバの構築が完了していること
事前準備
- パッケージのダウンロード
Ora2pg
- ora2pg-23.1.tar.gz https://github.com/darold/ora2pg/releases
Oracle Instant Client
https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html※Oracle Instant ClientのrpmパッケージをダウンロードするにはOracleアカウントを作成する必要があります
- oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm
- DBI-1.643.tar.gz https://www.cpan.org/modules/by-module/DBI/
- DBD-Oracle-1.83.tar.gz https://www.cpan.org/modules/by-module/DBD/
- ローカルリポジトリの作成(以下参考)
Ora2pgサーバを構築しよう!
では実際に、前提パッケージ及びOra2pgをインストールし、Ora2pgサーバを構築していきます!
手順は以下の通りです。
1.環境変数を設定する
Ora2pgのインストールや実行に必要な環境変数を設定します。
# cp -p ~/.bashrc ~/.bashrc.bk # vi ~/.bashrc(下記の内容をファイルに追記) ------------------------------------------------------------------- # Ora2pg用環境変数 export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib export ORACLE_HOME=/usr/lib/oracle/12.2/client64/lib # perlモジュール用環境変数 export PERL_LOCAL_LIB_ROOT="$PERL_LOCAL_LIB_ROOT:/root/perl5"; export PERL_MB_OPT="--install_base /root/perl5"; export PERL_MM_OPT="INSTALL_BASE=/root/perl5"; export PERL5LIB="/root/perl5/lib/perl5:$PERL5LIB"; export PATH="/root/perl5/bin:$PATH"; ------------------------------------------------------------------- # diff ~/.bashrc ~/.bashrc.bk (編集内容確認) # source ~/.bashrc # printenv | grep oracle (環境変数の確認) # printenv | grep PERL (環境変数の確認) # printenv | grep PATH (環境変数の確認)
2.パッケージ(gcc, perl-CPAN)をインストールする
オンラインで構築する場合はそのまま「yum install gcc,perl-CPAN」で済みますが、
今回はオフラインで構築する必要があるため、ローカルリポジトリを使用して「yum install gcc,perl-CPAN」を実行します。
リポジトリ作成用のインターネット接続可能な仮想マシンにおいてローカルリポジトリを作成し、Ora2pgサーバに格納します。ローカルリポジトリを作成する手順は以下を参考にしてください。
【RHEL, yumオフラインインストール】オフラインで依存関係解決しながらパッケージインストールなんて地獄(近日公開)
「ファイル」-「SSH SCP」でmyrepo.tar.gzを/tmp配下に格納する # ls -l /tmp (格納されたことを確認) # tar -zxvf /tmp/myrepo.tar.gz # ls -l (展開されたことを確認) # ls -l /tmp/myrepo (パッケージが/myrepo配下に格納されていることを確認)
repoファイルを作成する
# touch /etc/yum.repos.d/myrepo.repo # ls -l /etc/yum.repos.d (.repoファイル作成確認) # vi /etc/yum.repos.d/myrepo.repo (下記の通り追記する) ------------------------------------------- [myrepo] name=myrepo baseurl=file:///tmp/myrepo enabled=0 ------------------------------------------- # cat /etc/yum.repos.d/myrepo.repo (内容確認)
パッケージ(gcc, perl-CPAN)をインストールする
# yum --disablerepo=* --enablerepo=myrepo install perl-CPAN # yum list installed | grep perl-CPAN (インストール確認) # yum --disablerepo=* --enablerepo=myrepo install gcc # yum list installed | grep gcc (インストール確認)
(--disablerepo=* --enablerepo=myrepo と記述し、使用するリポジトリにmyrepoを指定します)
3.パッケージ(Oracle Instant Client)をインストールする
以下のパッケージをOra2pgサーバに格納し、オフラインインストールする。
- oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm
# mkdir /tmp/oracle_rpm # ls -l /tmp (ディレクトリ作成確認) 「ファイル」-「SSH SCP」でパッケージを/tmp/oracle_rpmに格納する # ls -l /tmp/oracle_rpm (格納されたことを確認) # cd /tmp/oracle_rpm # pwd (移動後確認) # yum localinstall -y --disablerepo=* oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm # yum localinstall -y --disablerepo=* oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm # yum localinstall -y --disablerepo=* oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm # yum localinstall -y --disablerepo=* oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm # yum list installed | grep oracle (インストール確認)
4.perlモジュール(DBI, DBD::Oracle)をインストールする
以下のperlモジュールをOra2pgサーバに格納し、オフラインインストールする。
# mkdir /tmp/perl_module 「ファイル」-「SSH SCP」でperlモジュールを/tmp/perl_moduleに格納する # ls -l /tmp/perl_module (格納されたことを確認)
# cd /tmp/perl_module # pwd (移動後確認) # tar -zxvf DBI-1.643.tar.gz # ls -l (展開確認) # cd DBI-1.643 # pwd (移動後確認) # perl Makefile.PL # make # make install # perldoc -m DBI (モジュールに関する説明が出力されればインストール済み)
# cd /tmp/perl_module # pwd (移動後確認) # tar -zxvf DBD-Oracle-1.83.tar.gz # ls -l (展開確認) # cd DBD-Oracle-1.83 # pwd (移動後確認) # perl Makefile.PL # make # make install # perldoc -m DBD::Oracle (モジュールに関する説明が出力されればインストール済み)
5.Ora2pgをインストールする
「ファイル」-「SSH SCP」でora2pg-23.1.tar.gzを/tmp/oracle_rpmに格納する # ls -l /tmp/oracle_rpm (格納されたことを確認) # cd /tmp/oracle_rpm # pwd (移動後確認) # tar -zxvf ora2pg-23.1.tar.gz # ls -l (展開確認) # mv /tmp/oracle_rpm/ora2pg-23.1 /usr/local/src/ # cd /usr/local/src/ora2pg-23.1 # pwd (移動後確認) # perl Makefile.PL # make # make install # ora2pg -v →(出力例)Ora2Pg v23.1
これでOra2pgサーバの構築完了です!
Ora2pgサーバでOracleサーバに接続しよう!
Ora2pgサーバが構築できたら、次はOracleサーバと接続してみましょう!
手順は以下の通りです。
1.プロジェクトテンプレートを作成する
# mkdir /root/migration # ls -l /root (ディレクトリ作成確認) # ora2pg --project_base /root/migration --init_project test_project # cp -p /root/migration/test_project/config/ora2pg.conf /root/migration/test_project/config/ora2pg.conf.bk # vi /root/migration/test_project/config/ora2pg.conf (下記の内容に編集) ----------------------------------------------------------------- (変更前) 23 ORACLE_DSN dbi:Oracle:host=mydb.mydom.fr;sid=SIDNAME;port=1521 24 ORACLE_USER system 25 ORACLE_PWD manager ----------------------------------------------------------------- (変更後) 23 ORACLE_DSN dbi:Oracle:host=【OracleサーバのプライベートIPアドレス】;sid=【対象DBのsid】;port=1521 24 ORACLE_USER system 25 ORACLE_PWD 【systemパスワード】 ------------------------------------------------------------------ # diff /root/migration/test_project/config/ora2pg.conf /root/migration/test_project/config/ora2pg.conf.bk (編集内容確認)
Oracleサーバが同じVNet内に存在するため、OracleサーバのプライベートIPアドレスを設定しています。
2.Oracleサーバへの接続確認
# cd /root/migration/test_project # pwd (移動後確認) # ora2pg -t SHOW_VERSION -c config/ora2pg.conf →(出力例)Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Oracleのバージョンが表示されればOra2pgサーバからOracleサーバへの接続ができています。
※Oracleのリスナーが起動していない場合、エラーが出力され接続ができません。その際はOracleのリスナーの状態を確認してください。
【番外編】移行評価レポートを出力してみよう
以下のような、Ora2pgで自動で変換できるかなどが記載された移行評価レポートを出力することができます。
https://ora2pg.darold.net/report.html
今回は後半で実際に移行するサンプルスキーマ(HR)を移行評価レポートの出力対象にします。
先ほどのora2pg.conf内にスキーマ名(HR)を追記し、レポートを出力します。
# vi /root/migration/test_project/config/ora2pg.conf (下記の内容に編集) ----------------------------------------------------------------- (変更前) 23 ORACLE_DSN dbi:Oracle:host=【OracleサーバのプライベートIPアドレス】;sid=【対象DBのsid】;port=1521 24 ORACLE_USER system 25 ORACLE_PWD 【systemパスワード】 ⁝ 49 SCHEMA CHANGE_THIS_SCHEMA_NAME ----------------------------------------------------------------- (変更後) 23 ORACLE_DSN dbi:Oracle:host=【OracleサーバのプライベートIPアドレス】;sid=【対象DBのsid】;port=1521 24 ORACLE_USER system 25 ORACLE_PWD 【systemパスワード】 ⁝ 49 SCHEMA HR ------------------------------------------------------------------ # diff/root/migration/test_project/config/ora2pg.conf/root/migration/test_project/config/ora2pg.conf.bk # ora2pg -c ./config/ora2pg.conf -t SHOW_REPORT --estimate_cost --dump_as_html --cost_unit_value 5 >/tmp/test.html # ls -l /tmp (レポート出力確認) 「ファイル」-「SSH SCP」でローカルにtest.htmlを転送する
test.htmlを開くと下のようなレポートが出力されていました。
データベースを移行する前に移行評価レポートを見てみるのもよいかもしれませんね~。
まとめ
今回はOra2pgサーバの全体の構築手順をまとめてみました! オフラインで構築するとなると、何かと工夫が必要ですね...大変勉強になりました。
文中にも記載がありましたが、以下にローカルリポジトリを用いたyumオフラインストールについてまとめています。こちらもぜひご覧くださいね!
【RHEL, yumオフラインインストール】オフラインで依存関係解決しながらパッケージインストールなんて地獄(近日公開)
参考
・ora2pgを使用してOracleからPostgreSQLへ移行する
・Ora2Pg (Oracle/PostgreSQLマイグレーションツール) www.sraoss.co.jp