plasmasphere.net -プラズマスフィア ドットネット-
Diary
Oracle から PostgreSQL への移行
2018/10/12(Fri) 17:10
Oracle から PostgreSQL への移行を対応しましたので、メモがてらに手順を置いておきます。
OSはCentOS7(RedHat7)です。Windowsは分かんねーわすまんな。
準備するもの
Oracleからの移行なので、当然Oracleは入ってるとして。
PostgreSQL。今回はバージョン10でやってます。
Oracle互換関数をPostgreSQLに実装してくれる Orafce。
移行ツールのOra2Pg。
月並みですが折れない心。特にOracleに慣れてる人はOSSのRDBはとっつきにくいかもしれません。
ソースからのコンパイルは全く使わず、全部パッケージ管理(yum)でインストールします。
再インストールもお気楽にできるのでとりあえず始めてみるが吉です。案ずるより産むがやすしです。
PostgreSQLをインストール。
# yum localinstall https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm # yum install postgresql10 postgresql10-libs postgresql10-server # /usr/pgsql-10/bin/postgresql-10-setup initdb # systemctl enable postgresql-10 # systemctl start postgresql-10
移行用のDBを作成します。test_database がデータベース名です。
エンコードを指定しとかないとOSデフォルトで作られます。基本的にUTF-8の筈ですが、分からなければ指定しておきましょう。
# su - postgres $ createdb test_database --encoding=UTF8 --template=template0 $ psql
Orafceのインストール。
便利な物がありますね。Orafce
細かい内容はQiitaを参考にするといいです。https://qiita.com/SRsawaguchi/items/410d709b474cd5862f5e
# yum search orafce # yum install orafce10.x86_64 # /usr/pgsql-10/bin/pg_confid --pkglibdir /usr/pgsql-10/lib # ls -la /usr/pgsql-10/lib/orafce.so -rw-r--r-- 1 root root 197560 Feb 17 2018 /usr/pgsql-10/lib/orafce.so $ psql -d test_database postgres=# create extension orafce; CREATE EXTENSION postgres=# \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+----------------------------------------------------------------------------------------------- orafce | 3.6 | public | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)
PostgreSQLに暗黙の型変換の追加と、Orafceに無いOracle互換関数を実行しておきます。
O/R Mapper 使ってるなら必要ないと思います。
Oracleのtruncは邪悪すぎるんだよなぁ…。
$ psql -d test_database postgres=# CREATE CAST (int8 AS text) WITH INOUT AS IMPLICIT; postgres=# CREATE CAST (int4 AS text) WITH INOUT AS IMPLICIT; postgres=# CREATE CAST (text as numeric) WITH INOUT AS IMPLICIT; postgres=# create or replace function add_months(TIMESTAMP with time zone, INT) returns DATE as \''''select add_months(cast($1 as date), $2)\'''' LANGUAGE \''''sql\''''; postgres=# create or replace function trunc(TEXT) returns TIMESTAMP as \''''select date_trunc(\''''\''''day\''''\'''', cast($1 as timestamp))\'''' LANGUAGE \''''sql\'''';
Ora2pgのインストール。
インストールは root 権限で行いますが、インストールするユーザの環境変数に ORACLE_HOME, C_INCLUDE_PATH, LD_LIBRARY_PATH が必要です。
登録されていない場合は、oracle ユーザから設定コピーしてくると良いです。
コマンドではGithubからwgetしてますが、gitコマンド使えるならcloneした方がいいです。
# yum install perl cpan libdbi-dbd-pgsql perl-ExtUtils-MakeMaker perl-DBI # mkdir ora2pg # cd ora2pg/ # wget https://github.com/darold/ora2pg/archive/master.zip # unzip master.zip # cd ora2pg-master/ # perl Makefile.PL # make install # cpan cpan> install DBI cpan> install DBD:Oracle cpan> quit
Ora2Pgの設定変更。
以下の項目を書き換えます。
ORACLE_HOME, ORACLE_DSN, ORACLE_USER, ORACLE_PWD, SCHEMA, LONGREADLEN
LONGREADLEN は clob 列等の容量が大きいカラムがあるなら設定しておかないと多分ちゃんと移行できません。
# cp ora2pg.conf.dist ora2pg.conf # vi ora2pg.conf
Ora2Pgを実行。
-t で出力を指定できます。COPYはデータ、TABLEは構造、SEQUENCEはシーケンスです。
基本的にこいつらで全部いけると思いますが、他にも出力できますので公式で調べてみてください。
Ora2pg
# ora2pg -t COPY -o test_database_data.sql -b /tmp/ -c ./ora2pg.conf # ora2pg -t TABLE -o test_database_ddl.sql -b /tmp/ -c ./ora2pg.conf # ora2pg -t SEQUENCE -o test_database_seq.sql -b /tmp/ -c ./ora2pg.conf
データの調整。
Oracleでは DATE 型だったものが、Ora2Pgを通すと Timestamp without timezone になっちゃってることがあったので、それを変換しておきます。
# -e s# timestamp,# date;#g /tmp/test_database_ddl.sql
SQLの実行。
# su - postgres $ psql -f /tmp/test_database_ddl.sql test_database $ psql -f /tmp/test_database_seq.sql test_database $ psql -f /tmp/test_database_data.sql test_database
データ移行自体はこれで終わりです。
必要に応じて PostgreSQL にユーザ作るなり、SQL叩くなりでデータの確認してください。
ポスグレのコマンドとかは、ggれば良いんじゃないかな。
PostgreSQLの基本的なコマンド
Oracleで全文検索(vgramとか)を使っている場合は、PGroongaがおすすめです。
Oracleより3倍早いですよ。
# yum install https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm # yum install postgresql10-pgroonga groonga-tokenizer-mecab # su - postgres $ psql postgres=# create extension pgroonga; postgres=# \dx List of installed extensions Name | Version | Schema | Description ----------+---------+------------+----------------------------------------------------------------------------------------------- orafce | 3.6 | public | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS pgroonga | 2.1.2 | public | Super fast and all languages supported full text search index based on Groonga plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
ちなみに、Oracleで PL/SQL 使ってるとかいう話しであれば、移行先は PostgreSQL よりは MariaDB の方が良いかもしれません。
https://mariadb.com/kb/en/library/changes-improvements-in-mariadb-103/