このトピックでは、oss_fdw 拡張機能の概要、制限、および使用方法について説明します。
概要
oss_fdw は、PolarDB for Oracle の外部データラッパー (FDW) 拡張機能です。Object Storage Service (OSS) のデータと PolarDB クラスタの外部テーブル定義を関連付けることができます。これにより、データベーステーブルのデータを OSS に格納しながら、標準 SQL 文を実行してデータの読み取りと書き込みを行うことができます。
OSS は、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、大量のデータを格納できます。 OSS は 99.995% のデータ可用性を提供するように設計されています。データベースの履歴データ、読み取り専用のアーカイブデータ、およびコールドデータは、ストレージコストを節約するために OSS に格納するのに最適です。
前提条件
OSS がアクティブ化され、バケットが作成されていること。詳細については、「OSS とは」をご参照ください。
この拡張機能は、次のエンジンを実行する PolarDB for PostgreSQL (Oracle 互換) クラスタでサポートされています。
PolarDB for PostgreSQL (Oracle 互換) 2.0 (リビジョンバージョン 2.0.14.5.3.0 以降)
PolarDB for PostgreSQL (Oracle 互換) 1.0 (リビジョンバージョン 2.0.11.2.1.0 以降)
説明コンソールでリビジョンバージョンを表示するか、
SHOW polardb_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 外部テーブルのテーブル名とスキーマ名(デフォルト値は
public)を指定して、OSS 外部テーブルのファイルを表示します。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;