2016年7月1日金曜日

Ora2Pgでやってみよう!テーブル定義移行編

こんにちは、kkidaです。
沖縄合宿2日目です。

昨日に引き続き、他DBからPostgreSQLへの移行の話を聞いていただいた方へ、是非この機会に紹介しておきたいのが、OracleまたはMySQLからテーブル定義・データを抽出してPostgreSQL用に書き換え、ロードまでを一括実行できる便利ツール、Ora2Pgを使用したデータ移行(とっかかり)です。


■ここでは何をやるか

移行してみるにあたり、Ora2Pgのオプション設定等は細かくはいろいろあるのですが、最初のハードルは「使える状態にすること」だと思います。(経験談w)
まずは使える状態にして、Oracleからテーブル定義を抜いてくるところができれば、あとはOra2Pgのマニュアルとにらめっこで、オプションをいろいろいじってみて、やりたい事に近づけるのではないでしょうか。

昨日紹介したPostgreSQL on CentOS 7環境で構築します。
例によって、DBサーバーは外部公開しづらい前提で、CentOSのインストールDVDからyumできるもの以外は、個々にモジュールを持って来てサーバーに配置するようにして、実際に動くところまでやってみました。


■準備

以下をダウンロードしておきます。WinSCPなどの転送ツールを使用して、サーバーの/media/ora2pgにrootユーザの所有で配置しておくものとします。
今回は使用したバージョンまで書いておきますが、相手のOracleのバージョンや、いずれかのモジュールの将来のバージョンでは、これらの組合せがそのままでは使えない可能性があることをご注意ください。

Ora2Pgはperlスクリプトで、各DBへの接続はDBD::xxxというDBへの接続ライブラリ(xxxはDB製品名、DBD::Oracleとか)を用います。その前提となるパッケージで、yumで入るものは入れてしまいましょう。また、昨日の続きなので、yum groupinstall "Development Tools"は導入済みとします。
# mount /dev/cdrom /media/CentOS
# yum --disablerepo=* --enablerepo=c7-media install libdbi-dbd-pgsql
# yum --disablerepo=* --enablerepo=c7-media install perl-ExtUtils-MakeMaker
# yum --disablerepo=* --enablerepo=c7-media install perl-DBI

■Oracle Clientのインストール

以下の順でRPMからインストール、環境変数を設定します。後続の手順であるDBD::Oracleのインストール時に、ここで作成したOracleのライブラリが参照されます。
# cd /media/ora2g
# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm
# export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
# export ORACLE_HOME=/usr/lib/oracle/11.2/client64/

■DBD::Oracleのインストール

以下の手順でソースファイルを展開、インストールします。
# cd /media/ora2pg
# tar zxvf DBD-Oracle-1.74.tar.gz
# cd DBD-Oracle-1.74
# cp ../DynaLoader.pm ./.
# perl Makefile.PL
# make install

■Ora2Pgのインストール

以下の手順でソースファイルを展開、インストールします。
# cd /media/ora2pg
# tar jxvf ora2pg-17.4.tar.bz2
# cd ora2pg-17.4/
# perl Makefile.PL
# make && make install

■Ora2Pgを使ってみる

構築が完了すると、/usr/local/bin/ora2pgコマンドと、/etc/ora2pg/ora2pg.conf.distファイルが出来上がります。Ora2Pgは、詳細動作を全て設定ファイルに書いて、ora2pgコマンド実行時にその設定ファイルを指定するという使い方をします。

設定ファイルの編集
# cd /etc/ora2pg
# cp ora2pg.conf.dist ora2pg.conf
# vim ora2pg.conf

最低限書いておく必要があるのは、Oracleへの接続方法と、移行対象です。
  • ORACLE_DSN      dbi:Oracle:host=<oracleのホスト名>;sid=<SID名>
  • ORACLE_USER    <Oracleの移行対象オブジェクトを触れるユーザー名>
  • ORACLE_PWD     <上記ユーザのパスワード>  
  • SCHEMA           <移行対象スキーマ名>
設定ファイルができたら、ora2pgコマンドを実行します。-cで設定ファイルを指定します。
# cd <任意のディレクトリ>
# /usr/local/bin/ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 1/1 tables (100.0%) end of scanning.
[========================>] 1/1 tables (100.0%) end of table export.
# ls
output.sql  ### PostgreSQL用のスクリプトが生成されている

出力されたファイルの中身を確認すると、PostgreSQL用のDDLスクリプトであることがわかります。参考までに、Oracleではnumber(8)、varchra2(30)、dateを各列のデータ型としていましたがPostgreSQLの対応するデータ型に書き変わっていることが読み取れます。
# more output.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=192.168.160.179;sid=v11204

SET client_encoding TO 'UTF8';

\set ON_ERROR_STOP ON


CREATE TABLE test (
  no integer NOT NULL,       --- number(8) がintegerに変換された
  val varchar(30),           --- varchar2(30) がvarchar(30)に変換された
  time timestamp             --- date が timestampに変換された
) ;
ALTER TABLE test ADD PRIMARY KEY (no);

本例では、Ora2Pgの実行時設定はほとんどをデフォルトとし、Oracleから指定スキーマの定義情報だけを抽出し、PostgreSQL用のスクリプトを生成するところまでとなりました。
定義情報と併せてデータも抜き出す設定であれば、一気にデータ移行が済んでしまいますし、PostgreSQLへの接続情報を書いておけば、直接PostgreSQLに投入することもできます。詳細動作はOra2Pgのマニュアルから、やりたいことに合わせて試していくことをお勧めします。

以上です。

1 件のコメント:

  1. 見返してみるとOracleのリスナーのポート指定してないけど、1521から変更している場合はどうなるんだろう。調べて追記する。

    返信削除