このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。
PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。
SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。
詳細は「データベースマイグレーションサービス」のページをご覧ください。
私が最初に任された仕事は、データベースのアクスセス部分の設計でした。 私は複数の商用データベースを調査しているうちに、SQL 文やデータ型が微妙に違うことに気がつきました。 当時の私には、何故そうなっているのかが全くわかりませんでしたが、データベースでは、ユーザのニーズや使いやすさを目的に SQL の拡張が行われています。
第 1 回では、PowerGres Plus と Oracle での SQL における高い親和性について説明しました。 それは、PowerGres Plus が基本とする PostgreSQL が Oracle を非常に意識しているためです。 Oracle と PostgreSQL で、若干 SQL の拡張がされていますが、ほとんどの場合は問題ありません。 また、データ型も名前だけが違うだけで、すべて対応しています。
第 2 回では、Oracle のデータベース定義から、PowerGres Plus 用のデータベース定義を作成するポイントについて説明します。
このシリーズでは、データベースの移行を以下の順番で説明します。図 1 はその概要です。

図 1: データベースの移行
今回は、データベース定義の移行について説明します。
今回は、すでにある Oracle のアプリケーションをモデルに説明します。 図 2 を参照してください。 これは、住宅情報を検索する Web アプリケーションです。

図 2: 移行モデル
Oracle のデータベースは、サンプルの「create_house_oracle.sql」を SQL*Plus で登録します。
データベースの定義は、ora2pg というツールを使用して簡単に移行することができます。 ora2pg は、Oracle からデータベース定義を移出 (export) し、テキストファイルに出力します。 必要であれば、修正をして PowerGres Plus に移入 (import) します。

図 3: ora2pg によるデータベース定義移行
ora2pg は以下から入手できます。
ora2pg を使うためには、Perl 5 の実行環境が必要です。 また、以下のモジュールがインストールされているか確認し、インストールされていない場合は、ダウンロードしてインストールしてください。
本実行例の説明で使われているモジュール情報は下記のようになっています。
ダウンロードページ https://search.cpan.org/~timb/DBI-1.48/
ダウンロードリンクhttps://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.48.tar.gz
ダウンロードページ https://search.cpan.org/~dbdpg/DBD-Pg-1.43/
ダウンロードリンク https://search.cpan.org/CPAN/authors/id/D/DB/DBDPG/DBD-Pg-1.43.tar.gz
ダウンロードページ https://search.cpan.org/dist/DBD-Oracle/
ダウンロードリンク https://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBD-Oracle-1.16.tar.gz
ダウンロードページ https://search.cpan.org/~steve/String-Random-0.20/
ダウンロードリンク https://search.cpan.org/CPAN/authors/id/S/ST/STEVE/String-Random-0.20.tar.gz
ダウンロードページ https://search.cpan.org/~pmqs/Compress-Zlib-1.41/
ダウンロードリンク https://search.cpan.org/CPAN/authors/id/P/PM/PMQS/Compress-Zlib-1.41.tar.gz
ダウンロードしたファイル「ora2pg-3.3.tar.gz」を任意のディレクトリに解凍します。 今回は、/usr/local に解凍しました。 解凍すると「ora2pg」というディレクトリが作成され、その下にすべてのファイルが格納されています。
テーブル定義を移出するための簡単な Perl スクリプト「export_schema.pl」を作成します。
#!/usr/bin/perl
BEGIN {ldelim}
$ENV{ldelim}ORACLE_HOME{rdelim}='/home/oracle/app/oracle/product/10.1.0/db_1';
$ENV{ldelim}NLS_LANG{rdelim} = 'JAPANESE_JAPAN.JA16EUC';
{rdelim}
use strict;
use Ora2Pg;
my $schema=new Ora2Pg (
datasource=>'dbi:Oracle:host=101.34.244.255;sid=demo1;port=1521',
user=>'postgres',
password=>'postgresplus',
schema=>'POSTGRES',
type=>'TABLE',
debug=>1
);
$schema->export_schema('/home/oracle/data_for_migrate/schema.sql');
exit(0);
| ORACLE_HOME | Oracle インストールディレクトリ |
|---|---|
| NLS_LANG | Oracle データベースのコード系を指定してます。 |
| datasource | Oracle にアクセスするための接続方法を指定します。 |
| user | Oracle にアクセスするユーザ名 |
| password | ユーザ名のパスワード |
| schema | 移出する定義が行われているスキーマを指定します。 必ず大文字で記述してください。 |
| TYPE | 出力する情報に「TABLE」と指定します。 表定義と、インデックス定義の情報が出力されます。 |
| schema->export_schema | PostgreSQL 用データベース定義の出力ファイル名 |
ora2pg を解凍したディレクトリに移動して以下のコマンドを入力します。
perl export_schema.pl ora2pg.conf
データベース定義用のファイル「schema.sql」が出力されます。
ora2pg の詳細な使用方法については、以下の URL を参照してください。
https://www.samse.fr/GPL/ora2pg/ora2pg.html
ora2pg では、一部 Oracle 固有の定義があるため、それらの定義は、無視され、出力されません。 また、データ型の対応についてもいくつか注意事項があります。 詳細は、ora2pg の注意事項 を参照してください。
Administrator で、データベース「house」を作成します。
以下のように作成します。
| データベース名 | house |
|---|---|
| データベーススペース名 | housedbspace |
| パス名 | /PlusDbspace/postgres/housedbspace |
| サイズ | 500 MB |
図 4: データベースの追加
インスタンス管理者で、以下のコマンドを入力してテーブルを作成します。
$ psql -d house < /home/oracle/data_for_migrate/schema.sql
これで Oracle のデータベース定義と同等の環境が PowerGres Plus に移行できました。
今回は、ツールを利用して Oracle のデータベース定義を PowerGres Plus に移行しました。 ツールを利用することで、簡単にデータベース定義を PowerGres Plus に構築できます。 次回は、今回作成したデータベース「house」にデータを移行するポイントを説明します。
第 1 回で説明したとおり、Oracle と PowerGres Plus は非常に親和性が高いため、データベースリソースもほとんど対応しています。
主なデータベースの構成要素例を以下に記述します。
| Oracle | PowerGres Plus | Oracle | PowerGres Plus |
|---|---|---|---|
| DATABASE | DATABASE | TRIGGER | TRIGGER |
| SCHEMA | SCHEMA | FUNCTION | FUNCTION |
| PACKAGE | SCHEMA | PROCEDURE | FUNCTION (△) |
| TABLE | TABLE | OPERATOR | OPERATOR |
| INDEX | INDEX | SEQUENCE | SEQUENCE |
| TYPE | TYPE | VIEW | VIEW |
PowerGres Plus では、上記以外にも、CONSTRAINT、REFERENCE INTEGRITY も対応しています。
| Oracle | 最大値 | PowerGres Plus | 最大値 | |
|---|---|---|---|---|
| 文字型 | CHAR | 2000 バイト | VARCHAR | 4000 バイト |
| NCHAR | 2000 バイト | VARCHAR | 4000 バイト | |
| VARCHAR2 | 4000 バイト | VARCHAR | 4000 バイト | |
| NVARCHAR2 | 4000 バイト | VARCHAR | 4000 バイト | |
| LONG | 2 GB | TEXT | 2 GB | |
| CLOB | 4 GB | TEXT | 4 GB | |
| NCLOB | 4 GB | TEXT | 4 GB | |
| 数値型 | NUMBER | 38 桁 | NUMERIC | 38 桁 |
| 日付型 | DATE | – | TIMESTAMP | – |
| TIMESTAMP | – | TIMESTAMP | – | |
| バイナリ型 | RAW | 2 KB | BYTEA | 2 GB |
| LONG RAW | 2 GB | BYTEA | 2 GB | |
| BLOB | 4 GB | BYTEA | 2 GB | |
| BFILE | 4 GB | ラージオブジェクト | 無制限 | |
ラージオブジェクトは論理上無制限です。
ora2pg では、RAW 型や、BLOB バイナリ型は TEXT 型に変換されます。 そのため、それらを BYTEA 型として扱えるようにするためには、JDBC を利用したアプリケーションなどを作成して、移行する必要があります。
PowerGres Plus と Oracle ではインデックスに指定できるレコード最大長が異なります。 Oracle は 2000 バイト、PowerGres Plus では、1000 バイトです。 1000 バイトを超えるレコード長のインデックスがある場合は、1000 バイト以下に変更する必要があります。