もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

ora2pgでOracleのテーブルをPostgreSQL9.6に移行した話

はじめに

とあるサービスを作ることになった。

あるパッケージに連帯するサービスで、パッケージではOracleDBを使用していた。

サービスの機能で、OracleDBの一部のテーブルのデータを取り出したかった。

しかし、サービス用のWebアプリをSpringBootで構築しようとし、OracleDBに接続できるかどうか試したところ上手くいかない・・・

運用するとなるとOracleDBのライセンス料がかかるし、どうせサービス用にパッケージとは別のDBを構築しないといけないし・・・

私はOracleDBを使ったことがなく、OracleDBのバージョンで別の部署の人がいつも揉めているイメージであまり使いたくない・・・

もうPostgreSQLを使いたい。もはやPostgreSQL信者

調べてみると、ora2pgというツールがあり、Oracle/MySQLからPostgreSQLへの移行を支援するツールがある。

パッケージで使用している一部のテーブルを、サービス用のDB(PostgreSQL)に移行・コピーしようとした


目次


環境


参考サイト

以下のサイトを参考にした。

kkida-galaxy.blogspot.com


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

ダウンロードしたパッケージをインストール

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/

設定したOracle環境変数を反映

. /etc/profile

ora2pgはperlを使っていて、perlOracleに接続できるようにDBD::Oracleのインストールする

cpan DBD::Oracle

このとき、cpanの設定(?)を聞かれたけど、全部デフォルトにした。

ora2pgのソースコードをダウンロード・コンパイルする

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

以下の項目を修正

移行してみる

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型カラム持ちのテーブルを変換する方法は有るらしい(試してない)