はじめに
「オープンソース」という言葉を耳にするようになり、久しくなりました。データベースの世界でも、PostgreSQL、MySQLなどバージョンアップのたびに機能が追加され、商用データベースからの移行を検討されている方もいらっしゃると思います。
PowerGres Plusは、PostgreSQLからのインタフェースを継承しているため、非常に多くのアプリケーションインタフェースに対応しています。PHP、Java、Cや、.NET Framework上で使えるアプリケーションインタフェースもあります。
さらに、トランザクションの考え方も「読み取り一貫性」とし、Oracleと同じ機能になっています。そのため、アプリケーションをスムーズに移行することができます。
本シリーズでは、OracleからPowerGres Plusへの移行を検討中のエンジニアの方々に向けて、実際の移行作業の過程を紹介します。
第1回目は、OracleとPowerGres Plusとの高い親和性によりOracleから少ないコストで移行できることを説明します。
表1はOracleとPowerGres Plusの代表的なプログラミングインタフェースの一覧です。
表1: OracleとPowerGres Plusのプログラミングインタフェース
言語/環境 | Oracle | PowerGres Plus |
.NET Framework | あり | あり |
スクリプト言語 | PHP,PL/SQL | PHP,PL/pgSQL |
C | Pro*C,OCI,ODBC | ECPG,CLI,ODBC |
Java | JDBC,SQLJ | JDBC |
PowerGres Plus では、Oracle と同等のプログラムインタフェースがサポートされています。
JDBC は SUN が提供する共通インタフェースであるため、コネクション文字列の変更でそのまま移行できます。
その他の言語についても、関数名のプレフィックスの違いがありますが、機能は同等で、少ない時間で移行することができます。詳細は、このシリーズの移行作業の中で紹介します。
PowerGres PlusもOracleも豊富なSQLインタフェースに対応しています。
以下に対応例を記述します。詳細は、このシリーズの移行作業で説明します。
データベースでは、基本的なデータ型に加え、拡張されたデータ型があります。Oracle でも拡張されたデータ型がありますが、PowerGres Plus には同じ機能のデータ型があるため、型名の書換えだけで対応することができます。
表2: OracleとPowerGres Plusのデータ型対応例
Oracle データ型 | 最大値 | PowerGres Plus | 最大値 | |
文字型 | CHAR | 2000Byte | VARCHAR | 4000Byte |
NCHAR | 2000Byte | VARCHAR | 4000Byte | |
VARCHAR2 | 4000Byte | VARCHAR | 4000Byte | |
NVARCHAR2 | 4000Byte | VARCHAR | 4000Byte | |
LONG | 2GByte | TEXT | 2GByte | |
CLOB | 4GByte | TEXT | 4GByte | |
NCLOB | 4GByte | TEXT | 4GByte | |
数値型 | NUMBER | 38桁 | NUMERIC | 38桁 |
日付型 | DATE | – | TIMESTAMP | – |
TIMESTAMP | – | TIMESTAMP | – | |
バイナリ型 | RAW | 2KByte | bytea | 2GByte |
LONG RAW | 2KByte | bytea | 2GByte | |
BLOB | 4KByte | bytea | 2GByte | |
BFILE | 4KByte | ラージオブジェクト | 無制限 |
ラージオブジェクトは論理上無制限です。
主なデータベースの構成要素例を以下に記述します。
表3: 主なデータベースの構成要素例
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 |
CONSTRATINT、 REFERENCE などすべて PowerGres Plus にもあります
PROCEDURE については、このシリーズのストアドプロシジャの移行で詳細を説明します
SELECT 文と組込み関数がポイントになります。
以下は、SELECT 文の記述の対応例です。SELECT 文の構文はほとんど同じです。下記の対応例のように、少し記述形式が違うものがありますが、機能には差はありません。
表4: SELECT文の記述の対応例
項目 | Oracle | PowerGres Plus |
列の別名 | “AS” 省略可 | “AS” が必須 |
結果の部分取り出し | ROWNUM | OFFSET |
LINE BETWEEN | OFFSET 〜 LIMIT | |
アウタージョイン | 拡張構文 “(+)” | 標準の記述形式 |
FROM 句副問合せ | エイリアス必要無 | エイリアス必須 |
Oracle の組み込み関数は約 70 個あります。PowerGres Plus も同等の関数があります。ごく少数の関数に関しては、数ステップから、数十ステップの同名の関数を登録することで、簡単に対応することができます。登録の詳細は、このシリーズで順次説明します。
表5: 組み込み関数の対応例
Oracle | PowerGres Plus |
CONCAT | 同名組込み関数をあらかじめ定義(約3ステップ) |
INSTR | 同名組込み関数をあらかじめ定義(約46ステップ) |
ADDR_MONTHS | 同名組込み関数をあらかじめ定義(約4ステップ) |
LAST_DAY | 同名組込み関数をあらかじめ定義(約5ステップ) |
MONTHS_BETWEEN | 同名組込み関数をあらかじめ定義(約5ステップ) |
NEXT_DAY | 同名組込み関数をあらかじめ定義(約46ステップ) |
GREATEST | 同名組込み関数をあらかじめ定義(約5ステップ) |
LEAST | 同名組込み関数をあらかじめ定義(約5ステップ) |
Oracle は、以下のようなトランザクションの考え方で動作します。
更新中に他のユーザが同じデータを参照できるようにする
参照できるデータは、ユーザの問合せに対して、常に一貫性を保証する
このようなトランザクションの考え方を「読み取り一貫性」とよび、商用データベースでは、Oracle独自のものでした。PowerGres Plus も同様のトランザクションの考え方を採用しているため、業務ロジックの考え方を変更する必要はありません。
図1: 読み取り一貫性
データベースの移行に関しては、「ora2pg」というオープンソースのツールを活用することで、作業を簡単にすることができます。
通常、データベース定義とデータは、以下の手順により移行します。
ora2pgを使用すると、1)と2)の処理を一度に行うことができます。このツールにより、移行作業の軽減が可能です。
図2: OracleからPowerGres Plusへの移行手順
ora2pgのサンプルは、PostgreSQLのcontrib/oracleのフォルダに提供されています。
今回は、OracleとPowerGres Plusの親和性についてご紹介しました。
Oracleとの親和性により、移行作業がスムーズに行えます。また、移行作業を支援するora2pgがあり、作業を行うことができます。
第2回目より、実際の移行作業の詳細をご紹介します。