すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:oss_fdw拡張子を使用して、外部データのテキストファイルを読み書きする

最終更新日:Mar 19, 2024

このトピックでは、oss_fdw拡張子を使用して、Object Storage Service (OSS) バケットからApsaraDB RDS for PostgreSQLインスタンスにデータをインポートする方法について説明します。 このトピックでは、oss_fdw拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスからOSSバケットにデータをエクスポートする方法についても説明します。

前提条件

RDSインスタンスはPostgreSQL 10以降を実行します。

説明

RDSインスタンスがPostgreSQL 14を実行している場合、RDSインスタンスのマイナーエンジンバージョンは20220830以降である必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。

# RDSインスタンスのoss_fdw拡張機能を作成します。
拡張子oss_fdwを作成します。-- OSSサーバーを作成します。 
CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS 
     (ホスト 'oss -cn-hangzhou.aliyuncs.com '、id 'xxx' 、key 'xxx' 、bucket 'mybucket');
-- ossexampleという名前の外部OSSテーブルを作成します。
CREATE FOREIGN TABLE ossexample 
    (date text, time text, open float,
     high float, low float, volume int) 
     SERVER ossserver 
     オプション (dir 'osstest/', delimiter',',
         フォーマット 'csv' 、エンコード 'utf8' 、PARSE_ERRORS '100');
-- RDSインスタンスにexampleという名前のテーブルを作成します。 このテーブルは、RDSインスタンスにインポートされたデータを保存するために使用されます。 
create table example
        (date text, time text, open float,
         高フロート、低フロート、ボリュームint);
-- ossexampleテーブルからサンプルテーブルにデータをインポートします。 
例select * from ossexampleに挿入します。-- oss_fdw拡張子を使用して、ossexampleテーブルのサイズを推定し、クエリプランを作成します。 
insert into exampleを説明する* from ossexample;
                             クエリ計画
---------------------------------------------------------------------
 例に挿入 (コスト=0.00 .. 1.60行=6幅=92)
   -> ossexampleの外部スキャン (コスト=0.00 .. 1.60行=6幅=92)
         Foreign OssFile: osstest/example.csv.0
         Foreign OssFileサイズ: 728
(4行)
-サンプルテーブルからossexampleテーブルにデータをエクスポートします。 
ocsample select * from exampleに挿入します。osexample select * from exampleへの挿入を説明します。
                           クエリ計画
-----------------------------------------------------------------
 ossexampleに挿入 (コスト=0.00 .. 16.60行=660幅=92)
   -> Seq例のスキャン (コスト=0.00 .. 16.60行=660幅=92)
(2行) 

上記の例のパラメーターの詳細については、次のセクションを参照してください。

oss_fdw拡張でサポートされているパラメーター

他の外部データラッパー (FDW) と同様に、oss_fdw拡張機能はOSSバケットに格納されている外部データをカプセル化します。 oss_fdw拡張子を使用して、OSSバケットからデータを読み取ることができます。 このプロセスは、データテーブルを読み取るプロセスと同様である。 oss_fdw拡張機能は、指定されたOSSバケットにアクセスし、OSSバケット内のOSSオブジェクトを解析するために使用されるいくつかの一意のパラメーターを提供します。

説明
  • oss_fdw拡張子は、CSV形式でOSSオブジェクトにデータを読み書きできます。 OSSオブジェクトには、gzipを使用して圧縮されたCSVオブジェクトが含まれます。

  • oss_fdw拡張で使用される各パラメーターの値は、二重引用符 ("") のペアで囲む必要があります。 また、各パラメーターの値に不要なスペースを含めることはできません。

CREATE SERVERステートメントのパラメーター

パラメーター

説明

host

OSSバケットの内部エンドポイント。

id

OSSへのアクセスに使用されるアカウントのAccessKey ID。

キー

OSSへのアクセスに使用されるアカウントのAccessKeyシークレット。

バケット

データを読み書きするオブジェクトのOSSバケット。 このパラメーターを設定する前に、OSSへのアクセスに使用するアカウントを作成する必要があります。

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

パラメーター

説明

oss_connect_timeout

接続のタイムアウト期間。 単位は秒です。 デフォルト値は 10 です。

oss_dns_cache_timeout

キャッシュされたドメインネームシステム (DNS) レコードのタイムアウト期間。 単位は秒です。 デフォルト値: 0。

oss_speed_limit

許容できる最小伝送速度。 単位:bit/s。 デフォルト値: 1024。 デフォルト値は1 Kbit/sです。

oss_speed_time

最小伝送速度を許容することができる最大期間。 単位は秒です。 デフォルト値:15。

説明

oss_speed_limitおよびoss_speed_timeパラメーターのデフォルト値を保持できます。 この場合、伝送レートが15秒間連続して1 Kbit/s未満のままであると、タイムアウトエラーが発生する。

CREATE FOREIGN TABLEステートメントのパラメーター

パラメーター

説明

ファイルパス

OSSバケットに保存されているオブジェクトの照合に使用されるオブジェクト名。 オブジェクト名にはOSSパスを含める必要があります。 filepathパラメーターとdirパラメーターのいずれかを設定できます。 filepathパラメーターを設定した場合、OSSバケットからRDSインスタンスにのみデータをインポートできます。

  • オブジェクト名にはOSSバケット名が含まれていません。

  • オブジェクト名は、OSSパスに保存されている複数のオブジェクトと一致します。 これにより、複数のオブジェクトからRDSインスタンスにデータをインポートできます。

  • RDSインスタンスにインポートできるのは、次の形式 (filepathおよびfilepath.x) のオブジェクトのデータのみです。 x変数の値は、1から始まる連続した整数でなければなりません。

    たとえば、OSSパスには、filepath、filepath.1、filepath.2、filepath.3、filepath.5の5つのオブジェクトが格納されます。 この場合、filepath、filepath.1、filepath.2、filepath.3は一致してインポートされますが、filepath.5は一致またはインポートできません。

dir

OSSバケットに保存されているオブジェクトの照合に使用されるフォルダー。 filepathパラメーターとdirパラメーターのいずれかを設定できます。 dirパラメーターを設定すると、OSSバケットとRDSインスタンス間でデータをインポートおよびエクスポートできます。

  • フォルダはスラッシュ (/) で終わる必要があります。

  • フォルダー内のすべてのオブジェクトのデータが照合され、RDSインスタンスにインポートされます。 ただし、これらのオブジェクトには、サブフォルダおよびサブフォルダに格納されているオブジェクトは含まれません。

prefix

OSSバケット内のOSSパスのプレフィックス。 このパラメーターは正規表現をサポートしていません。 prefix、filepath、dirのいずれかのパラメーターのみを設定できます。

フォーマット

OSSバケットに保存されているオブジェクトでサポートされている形式。 CSV形式のみがサポートされています。

encoding

OSSバケットに保存されているオブジェクトのデータをエンコードするために使用される形式です。 PostgreSQLの一般的なエンコード形式がサポートされています。 これらのサポートされるフォーマットはUTF-8を含む。

parse_errors

解析プロセス中に障害を許容するために使用されるモード。 解析プロセス中にエラーが発生した場合、エラーが発生した行全体が無視されます。

delimiter

OSSバケットに保存されているオブジェクトの列を区切るために使用される区切り文字。

quote

OSSバケットに保存されているオブジェクトでサポートされている引用文字。

脱出

OSSバケットに保存されているオブジェクトでサポートされているエスケープ文字。

null

null値を使用して空の列に追加します。 たとえば、nullの 'test' 設定を指定します。 この場合、テスト列が空の場合、null値を使用して入力されます。

force_not_null

null値ではなく空の文字列を使用して、空の列を指定します。 たとえば、force_not_null 'id' 設定を指定します。 この場合、ID列が空の場合、null値ではなく空の文字列を使用して入力されます。

compressiontype

OSSバケットに保存されているオブジェクトへのデータの読み書きに使用される圧縮形式。

  • none: データは圧縮されていません。 デフォルト値です。

  • gzip: データはGZIP形式で圧縮されます。

compressionlevel

OSSバケットに保存されているオブジェクトにデータを書き込むために使用される圧縮レベル。 有効値: 1~9。 デフォルト値: 6。

説明
  • filepathおよびdirパラメーターは、OPTIONSパラメーターで指定します。

  • filepathパラメーターまたはdirパラメーターを指定する必要があります。 両方のパラメータを指定しないでください。

  • RDSインスタンスからOSSバケットにデータをエクスポートする場合、dirパラメーターのみを指定できます。 filepathパラメーターは指定できません。

CREATE FOREIGN TABLEステートメントのパラメーター

  • oss_flush_block_size: 一度にOSSバケットに書き込むことができるデータのバッファサイズ。 有効な値: 1 ~ 128 単位:MB。 デフォルト値: 32。

  • oss_file_max_size: OSSバケット内のオブジェクトに書き込むことができるデータの最大量。 書き込まれる必要があるデータの量が最大値に達すると、残っているデータは新しいオブジェクトに書き込まれます。 有効値: 8 ~ 4000 単位:MB。 デフォルト値: 1024。

  • 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 (not_oss');
              名前 | サイズ
-------------------------------- -----------
 oss_test/test.gz.1  | 739698350
 oss_test/test.gz.2  | 739413041
 oss_test/test.gz.3 | 739562048
(3行) 

補助パラメータ

oss_fdw.rds_read_one_file: 外部テーブルが一致するOSSオブジェクトを指定します。 このパラメーターは、OSSバケットからRDSインスタンスにデータをインポートする場合にのみサポートされます。 このパラメーターを指定すると、指定された外部テーブルが一致するOSSオブジェクトのみがインポートされます。

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

set oss_fdw.rds_read_one_file = 'oss_test/test.gz.2 ';
oss_fdw_list_fileから * を選択します (_oss' ではありません) 。
              名前 | サイズ
-------------------------------- -----------
  oss_test/test.gz.2 | 739413041
(1行) 

使用上の注意

  • oss_fdw拡張は、外部テーブルを管理するためのPostgreSQL FOREIGN TABLEフレームワークに基づいて開発されています。

  • データインポートパフォーマンスは、使用可能なPostgreSQLおよびOSSリソースによって異なります。 PostgreSQLリソースは、CPU、I/O、およびメモリです。

  • 高パフォーマンスでデータをインポートするには、RDSインスタンスとOSSバケットが同じリージョンにあることを確認します。 詳細は、「OSSドメイン名」をご参照ください。

  • 外部テーブルからSQL文を読み取るときにエラー「error: oss endpoint userendpoint not in aliyun white list」が報告された場合は、指定したリージョンに提供されているパブリックOSSエンドポイントを使用することを推奨します。 詳細については、「リージョンとエンドポイント」をご参照ください。

トラブルシューティング

インポートまたはエクスポートエラーが発生した場合、次のエラー情報がログに記録されます。

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

  • error_code: OSSによって返されるエラーコード。

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

  • req_id: 失敗したリクエストのUUID。 問題の解決に支援が必要な場合は、失敗したリクエストのreq_id値を含むチケットを起票してください。

さまざまなエラーの詳細については、次のドキュメントを参照してください。 oss_ext拡張に関連するパラメーターを再設定することで、タイムアウトエラーを処理できます。

AccessKey IDとAccessKey secretの暗号化

CREATE SERVERステートメントのidパラメーターとkeyパラメーターの値を暗号化しない場合、他のユーザーはselect * from pg_foreign_serverステートメントを実行することで、AccessKeyペアをプレーンテキストで取得できます。 対称暗号化を使用して、idおよびkeyパラメーターの値を暗号化できます。 RDSインスタンスごとに異なるキーを使用します。 これにより、AccessKeyペアがさらに保護されます。 ただし、Greenplumのようにデータ型を追加することはできません。 これにより、以前のバージョンとの互換性がなくなります。

次のスニペットは、idおよびkeyパラメーターの暗号化された値を提供します。

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

各暗号化値はMD5文字列で始まります。 全長を8で割ったものは3である。 これらの暗号化された値がエクスポートされた後、それらは再び暗号化されません。 MD5文字列で始まるAccessKey IDまたはAccessKeyシークレットを作成することはできません。