BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【RHEL, Ora2pg】【全2回】Ora2pgを用いたデータベース移行に挑戦!_前半

はじめに

こんにちは! 株式会社BFT名古屋支店・新卒の「なる」と「もな」です!

今回はOra2pgを用いたデータベースの移行に挑戦しました!

行った手順を以下の3ステップで、全2回の記事に分けてご紹介したいと思います。
① Ora2pg構築
Oracleデータベースからのデータエクスポート
③ Postgresデータベースへのデータインポート


こちらの記事(前半)では①について書いていきます。

Ora2pgとは

OracleMySQLデータベースを PostgreSQLに移行するための無料ツールです。
OracleMySQLからDDL等のデータをエクスポートし、PostgreSQLにデータ等をインポートすることでデータベースを移行することができます。
詳しくはこちらを参照してください。
https://ora2pg.darold.net/(公式サイト)


検証の背景と構成図

今回は"既存のオンプレ環境のOracleDB"から"クラウド(Azure)環境のPostgresDB(PaaS)"への移行を想定して以下のような構成で検証を行いました。

※1 Oracleサーバについて

本来はオンプレ環境で用意して検証したいところでしたが、そのために必要なExpressRoute(Azureが提供しているオンプレ-クラウド間の通信サービス)は用意に手間がかかる&費用も高額なため、AzureVMにインストールしたOracleを使用しました。

※2 Ora2pgのインストール先について

一般的にはOracleDB用サーバやPostgresDB用サーバに同居させる構成もあるかと思いますが、今回は

  • OracleDB用サーバ…現在稼働中のものを使用するためいじりたくない
  • PostgresDB用サーバ…PaaSを使用するため他のアプリケーションを同居させることができない
という事情があるため、専用の仮想マシンをたててOra2pgをインストールしました。

※3 ネットワークについて

OracleDB用サーバとOra2pg用サーバは、本番環境に合わせてプライベート(インターネット接続ができない)VNet内に作成しました。 このため、こちらの記事で紹介するOra2pgインストール手順はオフラインでの作業を前提としています。


また、今回Ora2pgサーバをオフラインで構築するにあたって依存パッケージをインストールする際にインターネット接続可能な仮想マシンを1台使用しています。手順を参考にされる場合は、その点ご了承ください。
オフラインインストールの手順については、詳しく説明した記事がありますのでぜひ参考にしてください。

RHEL, yumオフラインインストール】オフラインで依存関係解決しながらパッケージインストールなんて地獄(近日公開)



Ora2pgサーバ構築の流れ

まず、Ora2pgサーバ構築全体の流れとこの記事で対象とする作業範囲について説明します。

※1 メタデータ(repodata)を作成して、リポジトリとしての機能を与えます。手順は以下を参考にしてください。
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の手順については別の記事で紹介しておりますので、そちらをぜひ参考にしてください)。

使用環境
Ora2pgサーバ Oracleサーバ
  • Azure VM
  • イメージ:Windows sever 2016 Datacenter Gen2
  • VMサイズ:Standard D2s v3
  • Oracleバージョン:12.2.0.1.0

使用パッケージ一覧

前提条件
  • Oracleサーバの構築が完了していること

事前準備
  • パッケージのダウンロード
今回はオフラインでパッケージをインストールする必要があるので、 ローカルPCに以下のURLからパッケージをダウンロードしておきます。

Ora2pg

Oracle Instant Client

   https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html   

Oracle Instant ClientのrpmパッケージをダウンロードするにはOracleアカウントを作成する必要があります

perlモジュール →【RHEL, yumオフラインインストール】オフラインで依存関係解決しながらパッケージインストールなんて地獄(近日公開)



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サーバに格納し、オフラインインストールする。

 # 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 (格納されたことを確認)

perlモジュール(DBI)インストール

 # 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 (モジュールに関する説明が出力されればインストール済み)  

perlモジュール(DBD::Oracle)インストール

# 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へ移行する

qiita.com

・Ora2Pg (Oracle/PostgreSQLマイグレーションツール) www.sraoss.co.jp