DBAtlas · 데이터베이스 운영 아틀라스

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와 재시작이 필요하다.

DBAtlas에서 열기 →

관련 항목