ApsaraDB RDS for PostgreSQL は oracle_fdw 拡張を提供します。この拡張を使用すると、Oracle データベースに接続し、PostgreSQL の外部テーブルを使用してそのデータを同期できます。
前提条件
-
ApsaraDB RDS for PostgreSQL インスタンスは、以下の要件を満たす必要があります。
-
メジャーバージョンは PostgreSQL 12 である必要があります。
-
マイナーエンジンバージョンは 20200421 以降である必要があります。
説明SHOW rds_supported_extensions;を実行して、 oracle_fdw がサポートされているかどうかを確認できます。サポートされていない場合は、マイナーエンジンバージョンをアップグレードしてください。 -
-
Oracle Client のバージョンは 11.2 以降である必要があります。
-
必要な Oracle Server のバージョンは、Oracle Client のバージョンによって異なります。詳細については、「Oracle 公式ドキュメント」をご参照ください。
-
Oracle データベースインスタンスの IP アドレスホワイトリストに、ApsaraDB RDS for PostgreSQL インスタンスの VPC CIDR ブロック (たとえば、
172.xx.xx.xx/16など) を追加します。説明インスタンスの [データベース接続] ページで VPC CIDR ブロックを確認できます。[データベース接続] ページで、[ネットワークタイプ] 行の CIDR ブロック (例:
172.x.x.x/16) を探します。詳細については、CIDR ブロックの横にある疑問符アイコンをクリックしてください。
背景
oracle_fdw は PostgreSQL の外部データラッパー拡張です。Oracle データベースからデータを読み取ることができ、PostgreSQL と Oracle 間のデータ同期を簡素化します。
詳細については、「oracle_fdw のドキュメント」をご参照ください。
注意事項
-
UPDATEおよびDELETE操作を実行するには、外部テーブルの作成時にプライマリキー列に対してkeyパラメータを設定する必要があります。詳細については、「外部テーブルの作成」をご参照ください。 -
oracle_fdw は、外部テーブルの列のデータ型を認識して変換できる必要があります。oracle_fdw 拡張のデータ型変換ルールについては、「データ型」をご参照ください。
-
WHERE句およびORDER BY句はプッシュダウンをサポートしており、oracle_fdw がこれらの句を Oracle データベースに送信して処理させます。 -
JOIN操作はプッシュダウンをサポートしていますが、以下の制限があります。-
テーブルは同じ外部サーバーで定義されている必要があります。
-
3 つ以上のテーブルを含む
JOIN操作では、プッシュダウンはサポートされていません。 -
JOIN操作はSELECTステートメントの一部である必要があります。 -
CROSS JOIN操作でJOIN条件がない場合、プッシュダウンはサポートされていません。 -
JOIN句がプッシュダウンされる場合、ORDER BY句はプッシュダウンされません。
-
-
PostGIS 拡張をインストールした後、oracle_fdw 拡張は以下の空間データ型をサポートします:
-
POINT
-
LINE
-
POLYGON
-
MULTIPOINT
-
MULTILINE
-
MULTIPOLYGON
-
拡張のインストールとアンインストール
拡張をインストールする前に、ApsaraDB RDS for PostgreSQL インスタンスがサポートされているメジャーバージョンおよびマイナーエンジンバージョンであることを確認してください。詳細については、「前提条件」をご参照ください。
拡張のインストール
CREATE EXTENSION oracle_fdw;
拡張のアンインストール
DROP EXTENSION oracle_fdw;
手順
-
Oracle データベースにマッピングするサーバーを作成します。以下のいずれかのコマンドを使用できます:
CREATE SERVER <server_name> FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//<oracle_internal_endpoint>:<oracle_internal_port>/<database_name>');CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (host '<oracle_internal_endpoint>', port '<oracle_internal_port>', dbname '<database_name>');
-
CREATE USER MAPPING FOR <postgresql_username> SERVER <server_name> OPTIONS (user '<oracle_username>', password '<oracle_password>');説明Oracle ユーザーの認証情報を PostgreSQL データベースに保存したくない場合は、
userオプションを空の文字列に設定し、必要な外部認証を提供できます。例:
CREATE USER MAPPING FOR pguser SERVER oradb OPTIONS (user 'orauser', password 'orapwd'); -
CREATE FOREIGN TABLE oratab ( id integer OPTIONS (key 'true') NOT NULL, text character varying(30), floating double precision NOT NULL ) SERVER oradb OPTIONS (table 'ORATAB', schema 'ORAUSER', max_long '32767', readonly 'false', sample_percent '100', prefetch '200');説明外部テーブルの構造は、対応する Oracle テーブルの構造と一致する必要があります。
以下の表は、
OPTIONS句のパラメータについて説明しています:パラメータ
説明
key
対応する列がプライマリキーであるかどうかを指定します。有効な値は
trueおよびfalseです。デフォルト値はfalseです。UPDATEおよびDELETE操作を実行するには、すべてのプライマリキー列に対してこのパラメータをtrueに設定する必要があります。table
テーブルの名前。このパラメーターは必須であり、通常は 大文字で指定します。このパラメーターの値として Oracle SQL 式を設定することもできます。例:
OPTIONS (table '(SELECT col FROM tab WHERE val = ''string'')')。SQL 式を使用する場合、schemaパラメーターは使用しないでください。schema
テーブルの所有者です。通常は Oracle ユーザー名を大文字で指定します。このパラメータは、現在の接続ユーザーに属していないテーブルにアクセスする場合に使用します。
max_long
Oracle テーブル内の
LONG、LONG RAW、およびXMLTYPEデータ型の列の最大長です。値の範囲は 1 ~ 1073741823 です。デフォルト値は 32767 です。readonly
Oracle テーブルを読み取り専用に設定します。これにより、
INSERT、UPDATE、およびDELETE操作が防止されます。sample_percent
PostgreSQL のテーブル統計に使用される Oracle テーブルデータのサンプリング率です。値の範囲は 0.000001 ~ 100 です。デフォルト値は 100 です。
prefetch
外部テーブルスキャン中に PostgreSQL と Oracle 間で一度に転送される行数です。値の範囲は 0 ~ 1024 です。デフォルト値は 200 です。値 0 を指定すると、プリフェッチ機能が無効になります。
これらの手順を完了すると、外部テーブルを介して Oracle テーブルを操作できます。DELETE、INSERT、UPDATE、および SELECT などの基本的な操作がサポートされています。また、以下のコマンドを実行して外部スキーマをインポートすることもできます:
IMPORT FOREIGN SCHEMA <ora_schema_name>
FROM SERVER <server_name>
INTO <schema_name>
OPTIONS (case 'lower');
case パラメータには以下の値を指定できます:
-
keep: Oracle のオブジェクト名を保持します。通常は大文字です。 -
lower: すべてのオブジェクト名を小文字に変換します。 -
smart:オブジェクト名に小文字が含まれていない場合、その名前を小文字に変換します。それ以外の場合は、元の名前を保持します。