pg_partmanでパーティションの作成と保存期間管理を自動化
PostgreSQLパーティション化コマンド
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;
CREATE TABLE public.measurements (
id bigint GENERATED ALWAYS AS IDENTITY,
ts timestamptz NOT NULL,
value numeric,
PRIMARY KEY (id, ts)
) PARTITION BY RANGE (ts);
-- Daily partitions, pre-create 7 days ahead (pg_partman 5.x syntax)
SELECT partman.create_parent(
p_parent_table := 'public.measurements',
p_control := 'ts',
p_interval := '1 day',
p_premake := 7
);
-- Drop partitions older than 30 days
UPDATE partman.part_config
SET retention = '30 days',
retention_keep_table = false
WHERE parent_table = 'public.measurements';
-- Maintenance: run periodically (schedule with pg_cron or pg_partman_bgw)
CALL partman.run_maintenance_proc();
-- Any rows in the default partition?
SELECT * FROM partman.check_default(p_exact_count := true);概要
親表をpg_partmanに登録する。将来のパーティションを事前作成し、保存期間を過ぎたものを削除し、デフォルトパーティションに入った行を報告する。
使用する場面
日次/月次のパーティションを手作業や独自スクリプトで管理する代わりに、標準的で監視可能な自動化が必要なとき(ログ、メトリック、イベントの表)。
注意
pg_partman 4.xと5.xの間でAPIが変更された: 5.xではp_typeは'range'/'list'のみを受け付け(デフォルト'range')、4.xのp_type := 'native'は無効。インストール済みのバージョンをSELECT extversion FROM pg_extension WHERE extname = 'pg_partman';で確認する。create_parentはデフォルトでデフォルトパーティションも作成する。retention_keep_table = falseはパーティションを完全にDROPする。アーカイブが必要な場合はtrueのままにしてretention_schemaを使用する。run_maintenance_proc()がスケジュールされていない場合、新しいパーティションは作成されず、データはデフォルトに入る。pg_partman_bgwにはshared_preload_librariesと再起動が必要。