時間範囲でパーティション化されたテーブルでは、古いパーティションへのアクセス頻度が低くなります。これらのパーティションを 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
----------------------
1cron.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
----------------------
3polar_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: heapTablespace: "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 操作は引き続き透明なままです。
次のステップ
polar_alter_subpartition_to_oss_interval — 一括コールドストレージ変換のための関数リファレンス
pg_cron — pg_cron 拡張の全ドキュメント