このトピックでは、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 以降である必要があります。 マイナーエンジンバージョンの更新方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
oss_fdw 拡張機能の使用
oss_fdw 拡張機能を作成します。 詳細については、「oss_fdw 拡張機能でサポートされているパラメータ」をご参照ください。
CREATE EXTENSION oss_fdw;
サーバーを作成します。 詳細については、「CREATE SERVER 文のパラメータ」をご参照ください。
CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS (host 'oss-cn-hangzhou-internal.aliyuncs.com' , id 'access_id', key 'secrect_key',bucket 'mybucket');
ossexample という名前の OSS 外部テーブルを作成します。 詳細については、「CREATE FOREIGN TABLE 文のパラメータ」をご参照ください。
CREATE FOREIGN TABLE ossexample (date text, time text, open float, high float, low float, volume int) SERVER ossserver OPTIONS ( dir 'osstest/', delimiter ',' , format 'csv', encoding 'utf8');
重要テーブル作成文のテーブルスキーマは参照用です。 外部テーブルのスキーマが、OSS オブジェクトに対応するテーブルのスキーマと同じであることを確認してください。
OSS 外部テーブルからデータを読み取り、RDS インスタンスに書き込みます。
OSS 外部テーブルからデータを読み取ります。
SELECT * FROM ossexample;
OSS バケット内のデータを RDS インスタンスに書き込みます。
ossexample テーブルと同じスキーマを持つ example という名前のテーブルを作成します。
CREATE TABLE example (date text, time text, open float, high float, low float, volume int);
OSS バケット内のデータを example テーブルに書き込みます。
INSERT INTO example SELECT * FROM ossexample;
EXPLAIN
文を実行して、OSS オブジェクトのサイズを見積もり、クエリプランを作成できます。EXPLAIN INSERT INTO example SELECT * FROM ossexample; QUERY PLAN ---------------------------------------------------------------------- Insert on example (cost=0.00..1.10 rows=0 width=0) -> Foreign Scan on ossexample (cost=0.00..1.10 rows=1 width=998) Foreign OssDir: osstest/ Number Of Ossfile: 2
example テーブルのデータを OSS バケットに書き込むこともできます。
INSERT INTO ossexample SELECT * FROM example;
oss_fdw パラメータの詳細については、次のセクションを参照してください。
oss_fdw 拡張機能でサポートされているパラメータ
他の外部データラッパー (FDW) と同様に、oss_fdw 拡張機能は OSS バケットに格納されている外部データをカプセル化します。 oss_fdw 拡張機能を使用して、OSS バケットからデータを読み取ることができます。 このプロセスは、データテーブルを読み取るプロセスに似ています。 oss_fdw 拡張機能は、OSS バケットに接続し、OSS バケット内のデータを分析するためのパラメータをサポートしています。
oss_fdw 拡張機能は、CSV 形式の OSS オブジェクトのデータを読み書きできます。 OSS オブジェクトには、gzip を使用して圧縮された CSV オブジェクトが含まれます。
CREATE SERVER 文のパラメータ
パラメータ | 説明 |
host | 必要なリージョンの OSS の内部エンドポイント。 内部エンドポイントを取得するには、次の操作を実行します。 OSS コンソール にログオンします。 [バケット] ページで、必要なバケットの名前をクリックします。 バケットの [概要] ページで、[エンドポイント] パラメータの値を確認します。 |
id | Alibaba Cloud アカウントの AccessKey ID。 詳細については、「AccessKey ペアの取得」をご参照ください。 |
key | Alibaba Cloud アカウントの AccessKey シークレット。 詳細については、「AccessKey ペアの取得」をご参照ください。 |
bucket | OSS バケットの名前。 OSS をアクティブ化してから、バケットを作成する必要があります。 |
次の表に、OSS によって提供されるフォールトトレランスパラメータを示します。 ネットワーク接続が悪い場合は、これらのパラメータの値を調整して、インポートとエクスポートを確実に成功させることができます。
パラメータ | 説明 |
oss_connect_timeout | 接続のタイムアウト期間。 単位:秒。 デフォルト値:10。 |
oss_dns_cache_timeout | キャッシュされたドメインネームシステム ( DNS ) レコードのタイムアウト期間。 単位:秒。 デフォルト値:60。 |
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 文のパラメータ
パラメータ | 説明 |
filepath | OSS バケットに格納されているオブジェクトと照合するために使用されるオブジェクト名。 オブジェクト名には OSS パスが含まれている必要があります。 filepath パラメータと dir パラメータのいずれかを構成できます。 filepath パラメータを構成した場合、OSS バケットから RDS インスタンスにのみデータをインポートできます。
|
dir | OSS バケットに格納されているオブジェクトと照合するために使用されるフォルダ。 filepath パラメータと dir パラメータのいずれかを構成できます。 dir パラメータを構成した場合、OSS バケットと RDS インスタンス間でデータをインポートおよびエクスポートできます。
|
prefix | オブジェクトへの OSS パスのプレフィックス。 このパラメータは正規表現をサポートしていません。 prefix、filepath、dir のパラメータのうち 1 つだけを構成できます。 |
format | OSS バケットに格納されているオブジェクトでサポートされている形式。 CSV 形式のみがサポートされています。 |
encoding | OSS バケットに格納されているオブジェクトのデータのエンコードに使用される形式。 PostgreSQL の一般的なエンコード形式がサポートされています。 これらのサポートされている形式には、UTF-8 が含まれます。 |
parse_errors | OSS バケットからデータを読み取るときのフォールトトレランスモードを解析します。 単位:データ行。 ファイル分析中に発生したエラーは無視されます。 重要 このパラメータは、RDS インスタンスから OSS バケットにデータを書き込む場合はサポートされていません。 RDS インスタンスから OSS バケットにデータを書き込む場合は、このパラメータを構成しないでください。 |
delimiter | OSS バケットに格納されているオブジェクトの列を区切るために使用されるデリミタ。 |
quote | OSS バケットに格納されているオブジェクトでサポートされている引用符。 |
escape | OSS バケットに格納されているオブジェクトでサポートされているエスケープ文字。 |
null | 空の列に null 値を入力します。 たとえば、null 'test' 設定を指定します。 この場合、test 列が空の場合、null 値を使用して入力されます。 |
force_not_null | 空の列に、null 値ではなく空の文字列を入力します。 たとえば、 |
compressiontype | OSS バケットに格納されているオブジェクトのデータの読み書きに使用される圧縮形式。
|
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('ossexample');
name | size
--------------------------------+-----------
osstest/test.gz.1 | 739698350
osstest/test.gz.2 | 739413041
osstest/test.gz.3 | 739562048
(3 rows)
補助パラメータ
oss_fdw.rds_read_one_file:外部テーブルが一致する OSS オブジェクトを指定します。 このパラメータは、OSS バケットから RDS インスタンスにデータをインポートする場合にのみサポートされます。 このパラメータを指定すると、指定された外部テーブルが一致する OSS オブジェクトのみがインポートされます。
SET oss_fdw.rds_read_one_file = 'osstest/test.gz.2';
SELECT * FROM oss_fdw_list_file('ossexample');
name | size
--------------------------------+-----------
oss_test/test.gz.2 | 739413041
(1 rows)
使用上の注意
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 シークレットの暗号化
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 | | | | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5****,key=MD5****,bucket=067862}
暗号化された各値は MD5 文字列で始まります。 合計の長さを 8 で割ると 3 になります。 これらの暗号化された値は、エクスポートされた後、再度暗号化されることはありません。 MD5 文字列で始まる AccessKey ID または AccessKey シークレットは作成できないことに注意してください。