このトピックでは、oss_fdw拡張機能の概要、制限、および使用方法について説明します。
概要
oss_fdw
は、PolarDB for PostgreSQL の外部データラッパー (FDW) 拡張です。 Object Storage Service (OSS) のデータをPolarDBクラスターの外部テーブル定義に関連付けることができます。 これにより、標準のSQL文を実行してデータを読み書きしながら、データベーステーブルのデータをOSSに保存できます。
OSSは、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、大量のデータを保存できます。 OSSは、99.995% データの可用性を提供するように設計されています。 データベース内の履歴データ、読み取り専用のアーカイブデータ、およびコールドデータは、ストレージコストを節約するためにOSSに保存するのに理想的です。
前提条件
OSSが有効化され、バケットが作成されます。 詳細については、「OSSとは」をご参照ください。
oss_fdw拡張機能は、次のエンジンを実行するPolarDB for PostgreSQLクラスターでサポートされています。
PostgreSQL 14 (バージョン14.5.3.0以降)
PostgreSQL 11 (バージョン1.1.1以降)
説明次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのマイナーエンジンバージョンを表示できます。
PostgreSQL 14
SELECT version();
PostgreSQL 11
SHOW polar_version;
制限事項
oss_fdw
外部テーブルは、SELECT
、INSERT
、およびTRUNCATE
ステートメントのみをサポートし、UPDATE
またはDELETE
ステートメントはサポートしません。 したがって、拡張機能はデータのアーカイブにのみ使用されます。データがOSSに書き込まれた後、データは読み取りのみ可能で、更新はできません。
使用法
拡張機能のインストール
CREATE EXTENSION oss_fdw;
外部データサーバーの作成
OSS接続情報を設定し、PolarDBとOSSバケット間のマッピングを作成します。
例:
CREATE SERVER ossserver
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
host 'oss-cn-xxx.aliyuncs.com',
bucket 'mybucket',
id 'xxx',
key 'xxx'
);
ステートメント内のパラメータ:
host
: OSSのエンドポイント。bucket
: OSSバケットの名前。id
/key
: Alibaba CloudアカウントのAccessKey IDとAccessKeyシークレット。
外部テーブルをOSSディレクトリにマップする
PolarDBでOSS外部テーブルを作成し、「外部データサーバーの作成」で指定された外部データソースのディレクトリにマップします。
CREATE FOREIGN TABLE t1_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (dir 'archive/');
OSS外部テーブルにデータをインポートします。
INSERT INTO t1_oss VALUES (generate_series(1,100), 0.1, 'hello');
テーブルに挿入されたデータは、
archive/
ディレクトリ内のファイルに書き込まれます。 次の方法を使用して、外部テーブルをクエリできます。EXPLAIN SELECT COUNT(*) FROM t1_oss; QUERY PLAN ----------------------------------------------------------------- Aggregate (cost=6.54..6.54 rows=1 width=8) -> Foreign Scan on t1_oss (cost=0.00..6.40 rows=54 width=0) Directory on OSS: archive/ Number Of OSS file: 1 Total size of OSS file: 1292 bytes (5 rows) SELECT COUNT(*) FROM t1_oss; count ------- 100 (1 row)
テーブルに対して
INSERT
文を再度実行すると、データはOSSディレクトリの新しいファイルに書き込まれます。INSERT INTO t1_oss VALUES (generate_series(1,100), 0.1, 'hello'); EXPLAIN SELECT COUNT(*) FROM t1_oss; QUERY PLAN ------------------------------------------------------------------- Aggregate (cost=12.07..12.08 rows=1 width=8) -> Foreign Scan on t1_oss (cost=0.00..11.80 rows=108 width=0) Directory on OSS: archive/ Number Of OSS file: 2 Total size of OSS file: 2584 bytes (5 rows) SELECT COUNT(*) FROM t1_oss; count ------- 200 (1 row)
TRUNCATE
文を実行して、外部テーブルのすべてのOSSマッピングファイルを削除します。TRUNCATE t1_oss; SELECT COUNT(*) FROM t1_oss; WARNING: does not match any file in oss count ------- 0 (1 row)
外部テーブルをディレクトリプレフィックスにマップする
prefix
オプションを使用して外部テーブルを作成します。CREATE FOREIGN TABLE t2_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (prefix 'prefix/file_');
外部テーブルでINSERTステートメントを実行すると、同じプレフィックス名を持つ複数のファイルが作成されます。
INSERT INTO t2_oss VALUES (generate_series(1,100), 0.1, 'hello'); INSERT INTO t2_oss VALUES (generate_series(1,100), 0.1, 'hello'); EXPLAIN SELECT COUNT(*) FROM t2_oss; QUERY PLAN ------------------------------------------------------------------- Aggregate (cost=12.07..12.08 rows=1 width=8) -> Foreign Scan on t2_oss (cost=0.00..11.80 rows=108 width=0) Directory on OSS: prefix/file_ Number Of OSS file: 2 Total size of OSS file: 2584 bytes (5 rows) SELECT COUNT(*) FROM t2_oss; count ------- 200 (1 row)
OSSファイルの保存形式
oss_fdw
では、OSSに保存されているデータの形式を設定できます。 デフォルト値はCSV
です。 形式を明示的に指定することもできます。 OSS外部テーブルでINSERT
文を実行すると、データはCSV
形式でOSSファイルに書き込まれます。
CREATE FOREIGN TABLE t3_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (dir 'archive_csv/', format 'csv');
OSS外部テーブルのファイルを表示する
OSS外部テーブルを作成し、
INSERT
文を3回実行して、3つのOSSファイルにデータを書き込みます。CREATE FOREIGN TABLE t4_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (dir 'archive_file_list/'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello');
次の関数を使用し、OSS外部テーブルのテーブル名とスキーマ名を指定して、OSS外部テーブルのファイルを表示します (デフォルト値は
public
です) 。SELECT * FROM oss_fdw_list_file('t4_oss'); name | size -------------------------------------------+-------- archive_file_list/_t4_oss_783053364762580 | 148894 archive_file_list/_t4_oss_783053364849053 | 148894 archive_file_list/_t4_oss_783053366496328 | 148894 (3 rows) SELECT * FROM oss_fdw_list_file('t4_oss', 'public'); name | size -------------------------------------------+-------- archive_file_list/_t4_oss_783053364762580 | 148894 archive_file_list/_t4_oss_783053364849053 | 148894 archive_file_list/_t4_oss_783053366496328 | 148894 (3 rows)
OSS圧縮
compressiontype
パラメーターは、OSSファイルにデータを書き込むための圧縮アルゴリズムを指定します。 このパラメーターはデフォルトでは空のままです。これは、データが圧縮されていないことを示します。 有効な値: gzipとzstd。
compressionlevel
パラメーターは、圧縮レベルを指定します。 より高い圧縮レベルは、圧縮および解凍中により多くのCPUが占有され、より少ないデータ量がネットワークを介して転送され、より少ないOSSスペースが外部テーブルによって使用されることを示します。
Gzip圧縮アルゴリズム
Gzip圧縮アルゴリズムの圧縮レベルの有効値: 1〜9。 デフォルト値: 6。
CREATE FOREIGN TABLE t5_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (
dir 'archive_file_compression/',
compressiontype 'gzip',
compressionlevel '9'
);
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
OSS外部テーブルのファイルを表示すると、Gzip圧縮されたファイルのサイズは、圧縮されていないファイルのサイズよりも大幅に小さくなります。
SELECT * FROM oss_fdw_list_file('t4_oss');
name | size
-------------------------------------------+--------
archive_file_list/_t4_oss_741147680906121 | 148894
archive_file_list/_t4_oss_741147680965631 | 148894
archive_file_list/_t4_oss_741147681201236 | 148894
(3 rows)
SELECT * FROM oss_fdw_list_file('t5_oss');
name | size
-----------------------------------------------------+-------
archive_file_compression/_t5_oss_741147752563794.gz | 23654
archive_file_compression/_t5_oss_741147752633713.gz | 23654
archive_file_compression/_t5_oss_741147752828680.gz | 23654
(3 rows)
Zstandard圧缩アルゴリズム
Zstandard圧縮アルゴリズムは、PostgreSQL 14 (バージョン14.9.13.0以降) を実行するクラスターでのみサポートされます。
Zstandard圧縮アルゴリズムの圧縮レベルの有効値: -7〜22。 デフォルト値: 6。
CREATE FOREIGN TABLE t6_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (
dir 'archive_file_zstd/',
compressiontype 'zstd',
compressionlevel '9'
);
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
OSS外部テーブルのファイルを表示すると、Zstandardで圧縮されたファイルのサイズは、圧縮されていないファイルのサイズよりも大幅に小さくなります。
SELECT * FROM oss_fdw_list_file('t4_oss');
name | size
-------------------------------------------+--------
archive_file_list/_t4_oss_741147680906121 | 148894
archive_file_list/_t4_oss_741147680965631 | 148894
archive_file_list/_t4_oss_741147681201236 | 148894
(3 rows)
SELECT * FROM oss_fdw_list_file('t6_oss');
name | size
-----------------------------------------------+------
archive_file_zstd/_t6_oss_748106174612293.zst | 6710
archive_file_zstd/_t6_oss_748106174700206.zst | 6710
archive_file_zstd/_t6_oss_748106174866829.zst | 6710
(3 rows)
エクステンションを削除する
DROP EXTENSION oss_fdw;