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

PolarDB:タイムラインに基づくパーティションテーブルの自動アーカイブ

最終更新日:Mar 29, 2026

時間範囲でパーティション化されたテーブルでは、古いパーティションへのアクセス頻度が低くなります。これらのパーティションを OSS コールドストレージにアーカイブすることで、ディスク領域を解放し、ストレージコストを削減できます。アーカイブ後も、作成・読取・更新・削除(CRUD)操作はすべて透明なままです。アプリケーションは、従来通りテーブルに対してクエリを実行できます。

このトピックでは、pg_cron 拡張機能を活用して、設定可能な経過期間しきい値に基づき、古いパーティションを OSS へ自動的にアーカイブする定期タスクを作成する方法について説明します。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • PolarDB for PostgreSQL クラスター

  • PostgreSQL データベースにアクセス可能な特権アカウント。該当するアカウントがない場合は、コンソールから事前に作成してください。

ステップ 1:pg_cron のインストール

特権アカウントを使用して PostgreSQL データベースに接続し、次のコマンドを実行します。

CREATE EXTENSION IF NOT EXISTS pg_cron;
pg_cron は PostgreSQL データベース内でのみインストール可能です。このコマンドは、ユーザーが所有するデータベースではなく、PostgreSQL データベースに接続した状態で実行してください。

ステップ 2:OSFS ツールキットのインストール

対象のデータベース(この例では db01)に接続し、次のコマンドを実行します。

CREATE EXTENSION IF NOT EXISTS polar_osfs_toolkit;

ステップ 3:パーティションテーブルの準備

このステップでは、サンプルのパーティションテーブルを構築します。既にアーカイブ対象のテーブルをお持ちの場合は、このステップをスキップしてください。

-- 時間範囲によるパーティション分割テーブルの作成
CREATE TABLE traj(
  tr_id serial,
  tr_lon float,
  tr_lat float,
  tr_time timestamp(6)
) PARTITION BY RANGE (tr_time);

-- 月次パーティションの作成
CREATE TABLE traj_202301 PARTITION OF traj
    FOR VALUES FROM ('2023-01-01') TO ('2023-02-01');
CREATE TABLE traj_202302 PARTITION OF traj
    FOR VALUES FROM ('2023-02-01') TO ('2023-03-01');
CREATE TABLE traj_202303 PARTITION OF traj
    FOR VALUES FROM ('2023-03-01') TO ('2023-04-01');
CREATE TABLE traj_202304 PARTITION OF traj
    FOR VALUES FROM ('2023-04-01') TO ('2023-05-01');

-- テストデータの挿入
INSERT INTO traj(tr_lon, tr_lat, tr_time) VALUES (112.35, 37.12, '2023-01-01');
INSERT INTO traj(tr_lon, tr_lat, tr_time) VALUES (112.35, 37.12, '2023-02-01');
INSERT INTO traj(tr_lon, tr_lat, tr_time) VALUES (112.35, 37.12, '2023-03-01');
INSERT INTO traj(tr_lon, tr_lat, tr_time) VALUES (112.35, 37.12, '2023-04-01');

-- インデックスの作成
CREATE INDEX traj_idx ON traj(tr_id);

ステップ 4:定期アーカイブタスクの作成

特権アカウントを使用して PostgreSQL データベースに接続し、cron.schedule_in_database を呼び出してタスクを作成します。

以下の例では、1 分ごとに実行されるタスク task1 を作成しています。このタスクは、traj テーブルのうち、3 日以上経過したパーティションを OSS コールドストレージへアーカイブします。

-- 1 分ごとに実行
postgres=> SELECT cron.schedule_in_database(
    'task1',          -- ジョブ名
    '* * * * *',      -- cron スケジュール(1 分ごと)
    'select polar_alter_subpartition_to_oss_interval(''traj'', ''3 days''::interval);',
    'db01'            -- 対象データベース
);
 schedule_in_database
----------------------
                    1

cron.schedule_in_database 関数には、以下の 4 つのパラメーターを指定します。

パラメーター説明
ジョブ名ジョブを一意に識別する名前'task1'
cron スケジュールジョブの実行タイミング(標準の 5 フィールド cron 式)'* * * * *'
コマンド実行する SQL 文'select polar_alter_subpartition_to_oss_interval(...)'
データベースSQL 文を実行するデータベース'db01'

cron スケジュール構文

cron 式は、スペースで区切られた 5 つのフィールドで構成されます。

┌───────────── 分(0–59)
│ ┌───────────── 時(0–23)
│ │ ┌───────────── 月の日(1–31)
│ │ │ ┌───────────── 月(1–12)
│ │ │ │ ┌───────────── 曜日(0–6、日曜日=0)
│ │ │ │ │
* * * * *

特殊文字の意味:

文字意味
*任意の値*(時フィールド)→ 毎時
,値のリスト1,15(日フィールド)→ 1 日目および 15 日目
-範囲1-5(曜日フィールド)→ 月曜日~金曜日
/ステップ*/6(時フィールド)→ 6 時間ごと

代表的なスケジュールパターン:

-- 毎日 10:00(GMT)に実行
postgres=> SELECT cron.schedule_in_database('task2', '0 10 * * *',
    'select polar_alter_subpartition_to_oss_interval(''traj'', ''3 days''::interval);', 'db01');
 schedule_in_database
----------------------
                    2

-- 毎月 4 日に実行
postgres=> SELECT cron.schedule_in_database('task3', '* * 4 * *',
    'select polar_alter_subpartition_to_oss_interval(''traj'', ''3 days''::interval);', 'db01');
 schedule_in_database
----------------------
                    3
polar_alter_subpartition_to_oss_interval の詳細な使用方法については、「関数リファレンス」をご参照ください。pg_cron のすべてのスケジューリングオプションについては、「pg_cron ドキュメント」をご参照ください。

ステップ 5:アーカイブ結果の確認

タスク実行後に、パーティションが OSS へ移動したかどうかを確認します。\d+ を使用してパーティションのメタデータを確認します。

db01=> \d+ traj_202301
                                                                     Table "public.traj_202301"
 Column  |              Type              | Collation | Nullable |               Default               | Storage | Compression | Stats target | Description
---------+--------------------------------+-----------+----------+-------------------------------------+---------+-------------+--------------+-------------
 tr_id   | integer                        |           | not null | nextval('traj_tr_id_seq'::regclass) | plain   |             |              |
 tr_lon  | double precision               |           |          |                                     | plain   |             |              |
 tr_lat  | double precision               |           |          |                                     | plain   |             |              |
 tr_time | timestamp(6) without time zone |           |          |                                     | plain   |             |              |
Partition of: traj FOR VALUES FROM ('2023-01-01 00:00:00') TO ('2023-02-01 00:00:00')
Partition constraint: ((tr_time IS NOT NULL) AND (tr_time >= '2023-01-01 00:00:00'::timestamp(6) without time zone) AND (tr_time < '2023-02-01 00:00:00'::timestamp(6) without time zone))
Replica Identity: FULL
Tablespace: "oss"
Access method: heap

Tablespace: "oss" という出力により、パーティションデータが OSS コールドストレージに格納されていることが確認できます。

ステップ 6:ジョブ実行の監視

cron.job_run_details をクエリして、過去の実行履歴を確認します。

postgres=> SELECT * FROM cron.job_run_details;
 jobid | runid | job_pid | database | username |                      command                       |  status   | return_message |          start_time           |           end_time
-------+-------+---------+----------+----------+----------------------------------------------------+-----------+----------------+-------------------------------+-------------------------------
     1 |     1 |  469075 | db01     | user1    | select polar_alter_subpartition_to_oss_interval('traj', '3 days'::interval); | succeeded | 1 row          | 2024-03-10 03:12:00.016068+00 | 2024-03-10 03:12:00.135428+00
     1 |     2 |  469910 | db01     | user1    | select polar_alter_subpartition_to_oss_interval('traj', '3 days'::interval); | succeeded | 1 row          | 2024-03-10 03:13:00.008358+00 | 2024-03-10 03:13:00.014189+00
     1 |     3 |  470746 | db01     | user1    | select polar_alter_subpartition_to_oss_interval('traj', '3 days'::interval); | succeeded | 1 row          | 2024-03-10 03:14:00.013165+00 | 2024-03-10 03:14:00.019002+00
     1 |     4 |  471593 | db01     | user1    | select polar_alter_subpartition_to_oss_interval('traj', '3 days'::interval); | succeeded | 1 row          | 2024-03-10 03:15:00.006494+00 | 2024-03-10 03:15:00.012056+00
(4 rows)

上記の結果より、期限切れとなったテーブルパーティションが設定されたルールに基づき、自動的にコールドストレージへアーカイブされていることが確認できます。アーカイブされたデータは OSS に保存され、ディスク領域を一切消費せず、ストレージコストを大幅に削減します。また、すべての CRUD 操作は引き続き透明なままです。

次のステップ