本作品はCC-BYライセンスによって許諾されています。通じてお寄せいただきますようお願いいたします。Incの米国、およびその他の国における商標もしくは登録商標です。Corporationの商標です。その子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。氏の日本およびその他の国における登録商標または商標です。Hat,Inc.の商標または登録商標です。Corporationの米国及びその他の国における登録商標または商標です。その子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。その子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。Canadaのカナダにおける登録商標およびその他の国における商標です。米国およびその他の国における登録商標です。Councilの商標です。商標または登録商標として使用している場合があります。本資料は、異種DBMSからPostgreSQLへ移行する際の移行作業コストを把握をするための情報提供を目的としています。今回は、「データベースオブジェクトの移行」をターゲットに整理しています。Databaseを想定し、「OracleからPostgreSQLへのデータベースオブジェクト移行」の範囲で記載しています。今回は、作業コストを把握しやすいように、データベースオブジェクトから主要なものに限定し取り扱っています。アーキテクチャ、SQL、組み込み関数などの相違については本資料では取り扱っていません。み込み関数移行調査編」などを参照してください。資料で記述する用語について以下に定義します。データベース管理システムを指します。ここでは、PostgreSQLおよび異種DBMSの総称として利用します。PostgreSQL以外のデータベース管理システムを指します。Databaseを指します。本書では以下のDBMS、ツールを前提にした調査結果を記載します。移行作業の視点¶データベースオブジェクト移行にあたり、異種DBMSとPostgreSQLの相違を理解する必要があります。オブジェクトの移行可否を把握し、移行に必要な作業量を測る視点と移行手段を整理します。次章以降では、上記の視点に基づき、データベースオブジェクト移行の共通要素と個別要素についてまとめています。あるのかを、オブジェクト定義文やDBMSのディクショナリの検索、目視により調査します。影響度合いは移行元DBMSにより異なるので、影響する作業量から影響度(高/中/低)などのように分類します。それから、オブジェクト単位(共通要素も含む)に影響本数と影響度に仕訳して、概算工数を算出します。オブジェクト移行の共通要素¶データベースオブジェクト移行にあたり、オブジェクト全体に共通した要素への影響を把握する必要があります。[対象範囲]オブジェクトの命名ルール予約語データ型PostgreSQLの命名ルールに従っていない場合や予約語と同じ名前のオブジェクトは修正が必要です。データ型の種類や精度の相違があるため、アプリケーション(業務)影響を考慮した対応付けが必要です。オブジェクトの命名ルール、予約語¶OracleとPostgreSQLではオブジェクトの命名ルール、予約語に違いがあります。それぞれの仕様を確認し、そのまま使用できない場合は変更をする必要があります。PostgreSQLの命名ルールに従わない場合や予約語を識別子として使用する場合は、識別子を二重引用符(")で囲む必要があります。アプリケーションのSQLについても識別子を二重引用符で囲む必要があります。オブジェクトの命名ルール¶PostgreSQLではオブジェクトの命名ルールとして以下があります。src/include/pg_config_manual.hに指定されている。デフォルトは64)デフォルト設定の場合、PostgreSQLの方が長い識別子を許容するため長さの制限は問題となりませんが、Oracleでオブジェクトの名前にシャープ記号(#)がついている場合は注意が必要です。移行ツールによる作業量の軽減¶Oracleでオブジェクトの名前にシャープ記号を使用している場合、Ora2Pgで出力されるSQLには二重引用符付きで出力されます。Ora2Pgで出力されたSQLのまま定義した場合、該当オブジェクトを指定する時はSQL内で必ず二重引用符をつけて指定する必要があります。DBMSの相違による手作業の作業量の把握¶シャープ記号を使わないオブジェクト名に変更する場合の作業量は、シャープ記号を使用している箇所数に依存します。オブジェクト名を変更する方法、二重引用符で囲む方法のどちらの対処を選択した場合でもアプリケーションのSQLに修正が必要です。予約語¶Oracleでは予約語ではありませんが、PostgreSQLでは予約語である単語があります。予約語と同じ名前のオブジェクトや変数を使用している場合は、名前を変更する必要があります。以下にPostgreSQLでは予約語となる単語の一例を記載します。移行ツールによる作業量の軽減¶Ora2Pgで出力されるSQLには、PostgreSQLでは定義できない名前でもそのまま出力されます。そのため、出力された後のSQLに対して名前の変更作業または二重引用符の付加を行う必要があります。定義の修正以外にもアプリケーションの修正が必要となります。予約語をオブジェクトや変数の名前に使用している箇所数に依存します。マッピングをして置き換えを行う必要があります。用途に合わせてchar(固定長)、varchar(上限付き可変長)、text(可変長)に移行。NUMBER型、浮動小数点型について精度やスケールに合わせて適切な型を選択して移行。PostgreSQLのdate型は時刻情報を保持しないため、timestamp系のデータ型に移行。バイナリ系のデータ型はbytea型に移行。ROWID、XMLType等のPostgreSQLに移行先の型はあるが機能的には十分でないもの、PostgreSQLに対応するデータ型がないもの、ユーザ定義型などについては、代替案やPostgreSQL上での実装を検討。基本的なデータ型については、Ora2Pgにより適切なPostgreSQLのデータ型への自動変換が可能です。移行先の型をパラメータで制御したり、データ型毎に任意の変換先のデータ型を指定することも可能です。文字列型¶Oracleの各種文字列型からPostgreSQLの文字列型に置き換えます。文字列型についてはchar、varchar、textから適切な型を自動選択して変換が可能です。数値型¶OracleのNUMBER型や浮動小数点型からPostgreSQLの適切なデータ型に置き換えます。PostgreSQLのnumeric型は演算処理の負荷が高いため、Ora2Pgでは下記のようにnumeric型を極力選択しない方向で変換を行います。bigintから適切な型を自動選択。小数点ありの場合、精度とスケールに応じてreal、floatに変換。それ以外の場合はnumericに変換。日付時刻型¶Oracleの日付時刻系のデータ型から適切なPostgreSQLのデータ型に置き換えます。基本的にはtimestamp系のデータ型に変換します。zone)に変換します。バイナリ型¶OracleのRAWやBLOB等のバイナリ系のデータ型は、PostgreSQLのbytea型に変換します。DBMSの相違による手作業の作業量の把握¶データ型の変換後の仕様差異による注意点や、ツールでは自動変換できないケースへの対応について記載します。文字列型¶PostgreSQLのtext型の最大長は1GBであるため、それを超えるサイズのデータが存在する可能性がある場合は、ラージオブジェクトでの代替等を検討する必要があります。文字列型に指定する長さは、Oracleでは文字数もしくはバイト数として扱うことが可能ですが、PostgreSQLは文字数固定となるため注意が必要です。数値型¶FLOAT型はPostgreSQLにも存在していますが、Oracleの方が最大精度が大きいため注意が必要です。日付時刻型¶TIMESTAMP系のデータ型の秒未満の精度情報は維持されません。精度指定なしの場合はPostgreSQLにおける精度は6桁になるため、必要に応じて追記をします。Oracleにおける最大精度は9桁であるため注意が必要です。バイナリ型¶PostgreSQLのbytea型の最大長は1GBであるため、それを超えるサイズのデータが存在する可能性がある場合は、ラージオブジェクトでの代替、ファイルパスのみでの管理等を検討する必要があります。その他の型¶ROWIDやBFILE、XMLType等はOra2Pgで自動変換が可能ですが、移行先のデータ型で要件を満たせるかを確認する必要があります。UROWID型など、Ora2Pgで自動変換ができないデータ型についてはそのまま出力されるため、別途対応方針を検討する必要があります。ユーザ定義のデータ型を使用している場合、個別にPostgreSQL上での実装や代替方法の検討が必要です。サンプルとして、Oracleにて下記テーブルが定義されているとします。UROWID);Ora2Pgを使用すると、デフォルトでは下記のように変換されます。;また、移行先のデータ型は任意に指定することが可能です。int型に変換されます。ROWID:int下記は本設定を行いサンプルのテーブルの変換した場合の出力です。スキーマオブジェクトの移行¶スキーマオブジェクトは、ユーザによってスキーマ内に作成される論理構造です。表や索引などのいくつかのオブジェクトはデータを保持します。シノニムなどのその他のオブジェクトは定義のみで構成されます。移行対象の選定作業¶データベースの根幹をなすオブジェクトであるテーブルについては、テーブルの種別や構成する列の定義に対して移行可否を検討します。PostgreSQLにも存在するが、セッションごとに定義する必要がある。同等の構文は存在しないが、機能の組み合わせによって代替可能。バイナリ等、基本的なデータ型については移行可能。DEFAULT句はPostgreSQLでも定義可能。定義内でOracle固有の関数やユーザ定義関数を使用している場合、代替が可能かを検討。基本的なテーブルの構文はOra2Pgで変換が可能です。PostgreSQLが対応していないオプションについては変換時に削除されます。一時テーブル¶Ora2Pgではデータベース上の定義から一時テーブルの変換をすることができません。DDL文を記載したファイルを入力とすることで、PostgreSQL向けに変換することは可能です。CHECK制約、トリガ等を組み合わせてパーティションを実現しています。Ora2Pgを使用する場合、方式によって自動変換の可否が異なります。親テーブル、子テーブル、子テーブルの分割キー列のインデックス、CHECK制約、INSERTトリガ等の構成要素に変換されます。ハッシュ、コンポジットパーティションの場合Ora2Pgでは対応していないため、単体のテーブルとして変換されます。列定義¶Ora2Pgで移行した結果、列に関連する定義について、対応が必要なポイントを整理します。Ora2Pgでは変換できないデータ型やユーザ定義型などについて、移行方法の検討をします。同じような機能を持つオプションが存在する場合、追記することを検討します。FILLFACTORにより代用が可能です。FILLFACTORでは挿入で使用可能な領域の割合を指定するため、設定値としては逆の意味合いを持ちます。PCTFREEのデフォルト値は10ですが、FILLFACTORのデフォルト値は100であるため、PostgreSQLのデフォルトでは更新用の領域は確保をしないことになります。TABLEというトランザクションログを出力しないテーブルが存在します。トランザクションログが必要な状況に陥った場合、テーブルが壊れた状態になってしまうため、単純な代替としては使用できません。アプリケーション等からセッションごとに都度定義をする必要があります。定義を追記する必要があります。ROWS」である点も注意が必要です。データが削除されてしまいます。パーティションの振り分けに使用する関数を作り込む必要があります。性能面で問題がないかについては、事前に検討をしておく必要があります。検討する必要があります。制約¶Oracleの制約については、表制約、列制約ともにPostgreSQLでも基本的な構文はそのまま使用可能です。関数や演算子を使用している場合、別途それらの移行が必要になる可能性がある。制約の状態に関するオプションについては、一部使用できないものがあります。遅延可能な制約には制限あり。PostgreSQLには機能が存在しない。PostgreSQLには機能が存在しない。PostgreSQLでも使用可能です。削除する必要があります。Ora2Pgを使用して移行した場合、不要なオプションについては削除が可能です。他に、制約の名称に関する制御を行うオプション等も存在します。その関数の代替を検討する必要があります。制約の定義に置き換えることが可能です。性能面での影響確認の必要があります。索引定義(DDL)をPostgreSQL用の定義に変換する作業が必要です。Ora2Pgで自動変換することで手作業量を軽減することが出来ます。通常索引¶Ora2Pgでの構文変換は、以下の範囲では100%の変換率です。索引定義に物理要素のオプションが指定がある場合は、「ソート順」]以外は除去されます。物理要素は移行元とは異なる物理配置の検討が必要です。関数索引¶Ora2Pgでの構文変換は、ユーザ定義関数・演算式では100%の変換率です。ユーザ定義関数と演算子の記述箇所は変換されません。組み込み関数は、PostgreSQL対応の異なる関数名に変換されます。PostgreSQLにない組み込み関数は事前に用意が必要です。DBMSの相違による手作業の作業量の把握¶DBMSの構造や仕様などの主要な相違点や対処方法を整理しました。利用頻度の高いもの(★印の項目)に関して、手作業時の作業量を計る視点をを記述しています。指定するカラムがNotNull制約でない場合、データ構造やアプリケーションの影響範囲を検討します。DBMSの仕様相違で関数が不変オブジェクトでない場合や関数が存在しない場合は、関数を作成する必要があります。Oracle互換関数として、orafceで多数の関数が提供されているので活用することを検討します。使用される頻度が高いビューの移行について説明します。ビューに指定された副問合せの移行作業については触れていませんので、別途考慮する必要があります。Oracleで利用可能なエディショニング・ビュー、オブジェクト・ビュー、XMLTypeビューについても触れませんので、利用している場合は別途考慮する必要があります。移行対象の選定作業¶Oracleで使用頻度が高いと思われるビューの定義に対する、PostgreSQL移行時の移行可否は以下のとおりです。