ora2pgでOracleのテーブルをPostgreSQL9.6に移行した話
はじめに
とあるサービスを作ることになった。
あるパッケージに連帯するサービスで、パッケージではOracleDBを使用していた。
サービスの機能で、OracleDBの一部のテーブルのデータを取り出したかった。
しかし、サービス用のWebアプリをSpringBootで構築しようとし、OracleDBに接続できるかどうか試したところ上手くいかない・・・
運用するとなるとOracleDBのライセンス料がかかるし、どうせサービス用にパッケージとは別のDBを構築しないといけないし・・・
私はOracleDBを使ったことがなく、OracleDBのバージョンで別の部署の人がいつも揉めているイメージであまり使いたくない・・・
もうPostgreSQLを使いたい。もはやPostgreSQL信者
調べてみると、ora2pgというツールがあり、Oracle/MySQLからPostgreSQLへの移行を支援するツールがある。
パッケージで使用している一部のテーブルを、サービス用のDB(PostgreSQL)に移行・コピーしようとした
目次
環境
- Windows Server 2012(AWS)
- Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
- CentOS 7.5(ローカル・Vagrant)
- PostgreSQL 9.6.9
- ora2pg 18.2
参考サイト
以下のサイトを参考にした。
ora2pgのインストール
ora2pgの動作に必要なパッケージをインストール
yum groupinstall "Development Tools" yum install libdbi-dbd-pgsql perl-ExtUtils-MakeMaker perl-DBI perl-CPAN
ora2pgに必要なパッケージをインストールするため、以下のツールをInstant Client for Linux x86-64 のダウンロードからダウンロードする。(アカウントの登録が必要)
Oracle client tool
- oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
ダウンロードしたパッケージをインストール
rpm -Uvh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm rpm -Uvh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm rpm -Uvh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
ファイル「/etc/profile.d/oracle.sh」を新規作成し、Oracle用の環境変数を追加。
vim /etc/profile.d/oracle.sh #!/bin/sh export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib export ORACLE_HOME=/usr/lib/oracle/11.2/client64/
. /etc/profile
ora2pgはperlを使っていて、perlがOracleに接続できるようにDBD::Oracleのインストールする
cpan DBD::Oracle
このとき、cpanの設定(?)を聞かれたけど、全部デフォルトにした。
cd /usr/local/src/ wget https://github.com/darold/ora2pg/archive/v18.2.tar.gz -O ora2pg_v18.2.tar.gz tar xf ora2pg_v18.2.tar.gz cd ora2pg_v18.2 perl Makefile.PL make && make install
ora2pgの設定ファイルの作成
cd /etc/ora2pg
cp ora2pg.conf.dist ora2pg.conf
vim ora2pg.conf
以下の項目を修正
- ORACLE_DSN dbi:Oracle:host=<DBのホスト>;sid=<サービス名>;port=1521
- ORACLE_USER <ユーザ名>
- ORACLE_PWD <パスワード>
- SCHEMA <移行対象のスキーマ名>
移行してみる
ora2pg -c /etc/ora2pg/ora2pg.conf ↓終了するとこんな出力がある [========================>] 836/836 tables (100.0%) end of scanning. [========================>] 836/836 tables (100.0%) end of table export.
コマンドを実行したディレクトリに「output.sql」が出来ている
あとは、PostgreSQLのコマンドでSQLを実行する。
psql -U 【ユーザ名】 【DB名】 < output.sql
ちなみに、「output.sql」にはテーブルのCreate文のみだった。
エクスポートタイプが設定ファイル(/etc/ora2pg/ora2pg.conf)の「TYPE」で設定されてあり、デフォルトは「TABLE」になっている。
エクスポートタイプを変更するには、設定ファイルを修正するか、「-t」または「--type」オプションを追加してコマンドを実行する
エクスポートタイプはこんな感じ
# Type of export. Values can be the following keyword: # TABLE Export tables, constraints, indexes, ... # PACKAGE Export packages # INSERT Export data from table as INSERT statement # COPY Export data from table as COPY statement # VIEW Export views # GRANT Export grants # SEQUENCE Export sequences # TRIGGER Export triggers # FUNCTION Export functions # PROCEDURE Export procedures # TABLESPACE Export tablespace (PostgreSQL >= 8 only) # TYPE Export user defined Oracle types # PARTITION Export range or list partition (PostgreSQL >= v8.4) # FDW Export table as foreign data wrapper tables # MVIEW Export materialized view as snapshot refresh view # QUERY Convert Oracle SQL queries from a file. # KETTLE Generate XML ktr template files to be used by Kettle.
とりあえず、自分の環境ではテーブルとデータがあれば良かったので、「TABLE」と「INSERT」のエクスポートタイプを使用した。
ちなみに移行するテーブルは限られていたので、「-a/--allow」オプションで、移行テーブルを選択することができた。
※「/etc/ora2pg/ora2pg.conf」の「ALLOW」に移行対象のテーブル名を記載する方法もあり。
↓ドキュメントの該当箇所
https://ora2pg.darold.net/documentation.html#Ora2Pg-usage
おわりに
LONG RAW型を使用しているカラムがあるテーブルは変換が出来ず、レコード数が4件しかないのに処理が数時間たっても終わらなかった。
やっぱり完璧に変換できるわけではなさそうだけど、LONG RAW型カラム持ちのテーブルを変換する方法は有るらしい(試してない)