このトピックでは、oss_fdw拡張子の概要、制限、および使用方法について説明します。
概要
oss_fdwは、 PolarDB for Oracleの外部データラッパー (FDW) 拡張です。 Object Storage Service (OSS) のデータをPolarDBクラスターの外部テーブル定義に関連付けることができます。 これにより、標準のSQL文を実行してデータを読み書きしながら、データベーステーブルのデータをOSSに保存できます。
OSSは、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、大量のデータを保存できます。 OSSは、99.995% データの可用性を提供するように設計されています。 データベース内の履歴データ、読み取り専用のアーカイブデータ、およびコールドデータは、ストレージコストを節約するためにOSSに保存するのに理想的です。
前提条件
OSSが有効化され、バケットが作成されます。 詳細については、「OSSとは」をご参照ください。
この拡張機能は、次のエンジンを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターでサポートされています。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.3.0以降)
PolarDB for PostgreSQL (Oracle互換) 1.0 (バージョン1.1.1以降)
説明次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
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圧縮アルゴリズムは、 PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.3.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;