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

PolarDB:oss_fdw

最終更新日:Apr 12, 2025

このトピックでは、oss_fdw 拡張機能の概要、制限、および使用方法について説明します。

概要

oss_fdw は、PolarDB for PostgreSQL の外部データラッパー (FDW) 拡張機能です。Object Storage Service (OSS) のデータと PolarDB クラスタの外部テーブル定義を関連付けることができます。これにより、データベーステーブルのデータを OSS に格納しながら、標準 SQL 文を実行してデータの読み取りと書き込みを行うことができます。

OSS は、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、大量のデータを格納できます。 OSS は 99.995% のデータ可用性を提供するように設計されています。データベースの履歴データ、読み取り専用のアーカイブデータ、およびコールドデータは、ストレージコストを節約するために OSS に格納するのに最適です。

前提条件

  • OSS がアクティブ化され、バケットが作成されていること。詳細については、「OSS とは」をご参照ください。

  • この拡張機能は、次のエンジンを実行する PolarDB for PostgreSQL クラスタでサポートされています。

    • PostgreSQL 16 (リビジョンバージョン 2.0.16.6.2.0 以降)

    • PostgreSQL 14 (リビジョンバージョン 2.0.14.5.3.0 以降)

    • PostgreSQL 11 (リビジョンバージョン 2.0.11.2.1.0 以降)

    説明

    コンソールでリビジョンバージョンを表示するか、SHOW polardb_version; 文を実行してリビジョンバージョンをクエリできます。リビジョンバージョンをアップグレードする必要がある場合は、「バージョン管理」をご参照ください。

制限

oss_fdw 外部テーブルは、SELECTINSERT、および 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 ディレクトリにマッピングする

  1. PolarDB に OSS 外部テーブルを作成し、外部データサーバーを作成する で指定されている外部データソースのディレクトリにマッピングします。

    CREATE FOREIGN TABLE t1_oss (
        id INT,
        f FLOAT,
        txt TEXT
    )
    SERVER ossserver
    OPTIONS (dir 'archive/');
  2. 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)

外部テーブルをディレクトリプレフィックスにマッピングする

  1. prefix オプションを使用して外部テーブルを作成します。

    CREATE FOREIGN TABLE t2_oss (
        id INT,
        f FLOAT,
        txt TEXT
    )
    SERVER ossserver
    OPTIONS (prefix 'prefix/file_');
  2. 外部テーブルで 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 外部テーブルのファイルを表示する

  1. 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');
  2. 次の関数を使用し、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 圧縮アルゴリズムは、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;