Alibaba Cloud では、oss_fdw プラグインを使用して、OSS のデータを Oracle データベースと互換性のある POLARDB にロードし、Oracle データベースと互換性のある POLARDB のデータを OSS に書き込むことができます。

oss_fdw パラメーター

oss_fdw プラグインは、他の外部データラッパー (FDW) インターフェイスと同様の方法を使用して、OSS に格納されている外部データをカプセル化します。 oss_fdw を使用して、OSS に保存されているデータを読み取ることができます。 このプロセスは、データテーブルの読み取りに似ています。 oss_fdw は、OSS でファイルデータに接続して解析するための一意のパラメーターを提供します。

  • oss_fdw は、OSS で次のタイプのファイルを読み書きすることができます。TEXT ファイルと CSV ファイル、および gzip 圧縮された TEXT ファイルと CSV ファイルです。
  • 各パラメーターの値は二重引用符 (")で囲む必要があり、不要なスペースを含めることはできません。

CREATE SERVER パラメーター

  • ossendpoint: ホストとも呼ばれる内部ネットワークを介して OSS にアクセスするために使用されるエンドポイント。
  • id oss: OSS アカウントの ID。
  • key oss: OSS アカウントのキー。
  • bucket: OSS バケット。 このパラメーターを指定する前に、OSS アカウントを作成する必要があります。

次のフォールトトレランスパラメーターは、データのインポートとエクスポートに使用します。 ネットワーク接続が不十分な場合は、これらのパラメーターを調整して、インポートとエクスポートを成功させることができます。

  • oss_connect_timeout: 接続タイムアウト期間を示します。 デフォルト値: 10。 単位: 秒。
  • oss_dns_cache_timeout: DNS タイムアウト期間を示します。 デフォルト値: 60。 単位: 秒。
  • oss_speed_limit: 最小データ転送速度を示します。 デフォルト値: 1。 単位: Kbit/s。
  • oss_speed_time: データ転送速度が最小値より低い最大期間を示します。 デフォルト値: 15。 単位: 秒。

デフォルトのパラメーター値が使用されている場合に、15 秒間連続して伝送速度が 1 Kbit/秒 より低下すると、タイムアウトエラーが生じます。

CREATE FOREIGN TABLE パラメーター

  • filepath: OSS のパスを含むファイル名。

    • ファイル名にパスが含まれますが、バケット名は含まれません。

    • このパラメーターは、OSS の対応するパスにある複数のファイルと一致します。 データベースに複数のファイルをロードすることができます。

    • filepath または filepath.x の形式で名前が付けられたファイルをデータベースにインポートします。 x の値は、1 から始まる連続した数値である必要があります。

      たとえば、filepath、filepath.1、filepath.2、filepath.3、filepath.5 という名前のファイルのうち、最初の 4 つのファイルが一致してインポートされます。 filepath.5 ファイルはインポートされません。

  • dir: OSS の仮想ファイルディレクトリ。

    • ディレクトリはスラッシュ (/) で始める必要があります。

    • dir で示される仮想ディレクトリ内のすべてのファイル (サブフォルダとサブフォルダ内のファイルを除く) が照合され、データベースにインポートされます。

  • prefix: データファイルに対応するパス名の接頭語。 接頭語は正規表現をサポートしていません。 prefix、filepath、および dir は相互に排他的であるため、一度に指定できるパラメーターは 1 つだけです。
  • format: ファイル形式は csv のみが可能です。

  • encoding: ファイルデータのエンコード形式。 UTF-8 などの一般的な PostgreSQL エンコーディングフォーマットがサポートされています。

  • parse_errors: フォールトトレラントな解析モード。 解析プロセス中にエラーが生じた場合、データの行全体が無視されます。

  • delimiter: 列の区切り文字。

  • quote: ファイルの引用文字。

  • escape: ファイルのエスケープ文字。

  • null: 指定された文字列に一致する列を null に設定します。

  • force_not_null: 列の値を null 以外の値に設定します。 たとえば、force_not_null 'id' は、'id' 列の値を空の文字列に設定するために使用されます。

  • compressiontype: OSS で読み書きするファイルの形式を指定します。

    • none: 圧縮されていないテキストファイル。 これがデフォルト値です。
    • gzip: 読み取るファイルは gzip 圧縮されている必要があります。
  • compressionlevel: OSS に書き込まれる圧縮形式の圧縮レベルを指定します。 有効値: 1~9。 デフォルト値: 6。

  • OPTIONS パラメーターでファイルパスとディレクトリを指定する必要があります。
  • filepath または dir を指定する必要があります。
  • 現在、エクスポートモードは仮想フォルダ、つまり、dir のみがサポートされています。

CREATE FOREIGN TABLE のエクスポートモードパラメーター

  • oss_flush_block_size: 一度に OSS に書き込まれたデータのバッファーサイズ。 デフォルト値: 32 MB。 有効な値: 1~128 MB。

  • oss_file_max_size: OSS に書き込まれるデータの最大ファイルサイズ (最大ファイルサイズを超えると、後続のデータは別のファイルに書き込まれます)。 デフォルト値 : 1024 MB。 有効な値: 8~4000 MB。

  • num_parallel_worker: OSS データが書き込まれる並列圧縮スレッドの数。 有効値: 1~8。 デフォルト値: 3。

補助関数

FUNCTION oss_fdw_list_file (relname text, schema text DEFAULT 'public')

  • 外部テーブルが一致する OSS ファイルの名前とサイズを取得します。

  • ファイルサイズの単位はバイトです。

select * from oss_fdw_list_file('t_oss');
              name              |   size    
--------------------------------+-----------
 oss_test/test.gz.1  | 739698350
 oss_test/test.gz.2  | 739413041
 oss_test/test.gz.3  | 739562048
(3 rows)

補助機能

oss_fdw.rds_read_one_file: 読み取りモードでは、外部テーブルと一致するファイルを指定します。 ファイルが指定されている場合、外部テーブルは、データのインポート時にこのファイルとのみ一致します。

例: set oss_fdw.rds_read_one_file = 'oss_test/example16.csv.1';

set oss_fdw.rds_read_one_file = 'oss_test/test.gz.2';
select * from oss_fdw_list_file('t_oss');
              name              |   size    
--------------------------------+-----------
  oss_test/test.gz.2  | 739413041
(1 rows)

oss_fdw の例

# Create a plug-in
create extension oss_fdw; 
# Create a server 
CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS 
     (host 'oss-cn-hangzhou.aliyuncs.com', id 'xxx', key 'xxx', bucket 'mybucket');
# Create an OSS external table
CREATE FOREIGN TABLE ossexample 
    (date text, time text, open float,
     high float, low float, volume int) 
     SERVER ossserver 
     OPTIONS ( filepath 'osstest/example.csv', delimiter ',' ,
         format 'csv', encoding 'utf8', PARSE_ERRORS '100');
# Create a table to load data to
create table example
        (date text, time text, open float,
         high float, low float, volume int)
# Load data from ossexample to example.
insert into example select * from ossexample;
# Result
# oss_fdw estimates the file size in OSS and formulates a query plan correctly.
explain insert into example select * from ossexample;
                             QUERY PLAN                              
---------------------------------------------------------------------
 Insert on example (cost=0.00..1.60 rows=6 width=92)
   ->  Foreign Scan on ossexample (cost=0.00..1.60 rows=6 width=92)
         Foreign OssFile: osstest/example.csv.0
         Foreign OssFile Size: 728
(4 rows)
# Write the data in the example table to OSS.
insert into ossexample select * from example;
explain insert into ossexample select * from example;
                           QUERY PLAN
-----------------------------------------------------------------
 Insert on ossexample (cost=0.00..16.60 rows=660 width=92)
   ->  Seq Scan on example (cost=0.00..16.60 rows=660 width=92)
(2 rows)

oss_fdw の使用に関する考慮事項

  • oss_fdw は、PostgreSQL の FOREIGN TABLE フレームワークに基づいて開発された外部テーブルプラグインです。

  • データのインポート効率は、Oracle クラスターリソース (CPU、I/O、メモリ、MET) および OSS と互換性のある POLARDB の影響を受けます。

  • データインポートのパフォーマンスを保証するには、Oracle と互換性のある POLARDB が OSS と同じリージョンにあることをご確認ください。 詳細については、「」「エンドポイント (Endpoints)」をご参照ください。

  • 外部テーブルの SQL 文の読み取り中に "oss endpoint userendpoint not in aliyun white list" というエラーが報告された場合は、「」「リージョンとエンドポイント (Regions and endpoints)」にリストされているエンドポイントを使用してください。 問題が解決しない場合は、チケットを起票し、サポートセンターへお問い合わせください。

エラー処理

インポートまたはエクスポートエラーが生じた場合には、エラーログには次の情報が含まれています。

  • code: 失敗したリクエストの HTTP ステータスコード。

  • error_code: OSS から返されたエラーコード。

  • error_msg: OSS から返されたエラーメッセージ。

  • req_id: リクエストを識別する UUID。 問題を解決できない場合は、req_id を提供することで OSS 開発エンジニアに助けを求めることができます。

ログフィールドの詳細は、次の図をご参照ください。 タイムアウトエラーは oss_ext パラメーターを使用して処理します。

ID とキーの暗号化

CREATE SERVER の id および key パラメーターが暗号化されていない場合は、select * from pg_foreign_server 文を実行すると、情報がプレーンテキストで表示されます。 ID とキーが公開されます。 対称暗号化を使用して、ID とキーを非表示にすることができます。 インスタンスごとに異なるキーを使用して、情報をさらに保護します。 ただし、以前のバージョンとの非互換性を回避するために、Greenplum で行うようにデータ型を追加しないでください。

暗号化された情報

postgres=# select * from pg_foreign_server ;
  srvname  | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                                              srvoptions
-----------+----------+--------+---------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------
----------------------------------
 ossserver |       10 |  16390 |         |            |        | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5xxxxxxxx,key=MD5xxxxxxxx,bucket=067862}

暗号化された情報の前には、MD5 ハッシュ値が付きます。 全長を 8 で割った余りは 3 です。 そのため、エクスポートされたデータがインポートされるとき再び暗号化されません。 しかし、ユーザーは MD5 で始まるキーと ID を作成することはできません。