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에 등록한다. 미래 파티션을 미리 만들고, 보존 기간이 지난 파티션을 삭제하며, default 파티션에 들어간 행을 보고한다.
사용 시점
일별/월별 파티션을 수동이나 사용자 스크립트로 관리하는 대신 표준적이고 관찰 가능한 자동화가 필요할 때(로그, 지표, 이벤트 테이블).
주의
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는 기본적으로 default 파티션도 만든다. retention_keep_table = false는 파티션을 영구 DROP하므로 아카이브가 필요하면 true로 두고 retention_schema를 사용한다. run_maintenance_proc()이 예약되어 있지 않으면 새 파티션이 생성되지 않아 데이터가 default에 들어간다. pg_partman_bgw는 shared_preload_libraries와 재시작이 필요하다.