본문으로 건너뛰기

7.5 자동 파티션 관리 (pg_partman)

선언적 파티셔닝은 코어가 SQL 라우팅·pruning을 해 주지만, 새 파티션 생성과 오래된 파티션 정리는 운영자 몫입니다. 100개 넘는 파티션을 손으로 만들고 지우는 일은 비현실적. pg_partman(PostgreSQL Partition Manager)이 표준 자동화 도구입니다. Keith Fiske가 메인테이너로 관리하고 PostgreSQL License로 공개돼 있으며, PGDG yum/apt 저장소에 패키지로 들어 있습니다.

파티션 자동 관리 주기

설치​

# RHEL/Rocky (PGDG)
sudo dnf install -y pg_partman_17

# Debian/Ubuntu (PGDG)
sudo apt-get install -y postgresql-17-partman
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;

스키마를 지정하지 않으면 현재 스키마(보통 public)에 설치되므로, 이 글의 예시처럼 partman 스키마를 명시합니다. 모든 메타데이터·함수가 이 스키마에 들어갑니다.

첫 파티션 등록​

이미 선언적 파티션된 부모를 pg_partman에 등록합니다.

SELECT partman.create_parent(
p_parent_table := 'public.events',
p_control := 'created_at',
p_type := 'range',
p_interval := '1 month', -- 월 파티션
p_premake := 4, -- 앞으로 4개월치 미리
p_start_partition := '2026-01-01' -- 시작 시점
);

이 한 번의 호출로:

  • events_p20260101, events_p20260201, …, events_p20260601 같은 자식이 자동 생성 (5.x는 1일 이상 간격이면 YYYYMMDD 접미사)
  • partman.part_config에 부모 설정이 기록 — 이후 유지보수의 기준

정기 유지보수​

run_maintenance 함수가 모든 등록된 부모를 점검해 필요한 파티션을 생성하고, retention 정책에 맞게 오래된 파티션을 처리합니다.

-- 단일 부모
SELECT partman.run_maintenance('public.events');

-- 등록된 모든 부모
SELECT partman.run_maintenance();

cron 또는 백그라운드 워커로 매시간/매일 호출합니다.

백그라운드 워커 (pg_partman_bgw)​

shared_preload_libraries에 pg_partman_bgw를 넣으면 PostgreSQL이 자체적으로 유지보수를 실행하므로 cron이 필요 없습니다.

# postgresql.conf
shared_preload_libraries = 'pg_partman_bgw'
pg_partman_bgw.interval = 3600 # 1시간마다
pg_partman_bgw.role = 'postgres'
pg_partman_bgw.dbname = 'app_main'

Retention 정책​

오래된 파티션을 자동 처리합니다.

UPDATE partman.part_config
SET retention = '12 months', -- 1년 보유
retention_keep_table = false, -- DROP (false) 또는 DETACH만 (true)
retention_schema = 'archive' -- DETACH 시 옮길 스키마
WHERE parent_table = 'public.events';
옵션의미
retention보존 기간 (12 months, 90 days, …)
retention_keep_table = true파티션을 부모에서 떼어내되 테이블 자체는 남김
retention_keep_table = falseDROP (완전 삭제)
retention_schemaDETACH 시 옮길 스키마 — archive로 보내고 별도 S3 dump 가능

run_maintenance가 호출될 때 retention 정책에 걸리는 파티션을 자동 처리합니다.

자주 쓰는 시나리오​

시계열 이벤트 (3개월 보유, 그 이전은 archive)​

SELECT partman.create_parent(
p_parent_table := 'public.events',
p_control := 'created_at',
p_type := 'range',
p_interval := '1 day', -- 일 단위
p_premake := 7 -- 일주일치 미리
);

UPDATE partman.part_config
SET retention = '90 days',
retention_keep_table = true,
retention_schema = 'archive'
WHERE parent_table = 'public.events';

시계열 + tenant subpartition​

pg_partman은 subpartitioning도 지원하지만 복잡합니다. 운영에서는 상위 파티션만 pg_partman으로 자동화하고, subpartition은 별도로 자동화하기를 권장합니다.

운영 확인​

-- pg_partman이 관리하는 부모들
SELECT parent_table, partition_interval, premake, retention
FROM partman.part_config;

-- 자식 파티션 목록
SELECT partman.show_partitions('public.events');

-- 자식 파티션의 경계값(시작/끝)과 접미사
SELECT * FROM partman.show_partition_info('public.events_p20260501'::regclass::text);

자체 cron + SQL — 작은 시스템에서​

pg_partman을 안 쓰고 직접 자동화도 가능합니다. 작은 시스템·간단한 케이스:

#!/bin/bash
# /usr/local/bin/create_next_partition.sh: 다음 달 파티션 생성 (GNU date 기준)
set -euo pipefail
next=$(date -d "$(date +%Y-%m-01) +1 month" +%Y-%m-01)
after=$(date -d "$next +1 month" +%Y-%m-01)
suffix=$(date -d "$next" +%Y_%m)
psql -c "
CREATE TABLE IF NOT EXISTS events_${suffix}
PARTITION OF events
FOR VALUES FROM ('${next}') TO ('${after}');
"

crontab에서는 %를 이스케이프해야 하므로 명령을 직접 쓰지 않고 스크립트만 호출합니다.

# crontab: 매월 1일 실행
0 0 1 * * /usr/local/bin/create_next_partition.sh

운영 자동화로 보면 pg_partman이 훨씬 견고. 자체 cron은 시작 단계에서만 권장합니다.

핵심 함수 모음​

함수용도
create_parent(...)자동화 등록
run_maintenance(...)정기 유지보수
undo_partition(...)자식 데이터를 부모로 합침
partition_data_proc(...)옛 부모(상속 기반)의 데이터를 선언적 자식들로 이동
show_partitions(...)자식 목록
apply_constraints(...)constraint_cols로 지정한 컬럼에 대한 제약을 오래된 자식에 추가

주의 — 잘못 쓰면 위험​

주의메모
retention이 너무 짧음의도치 않은 데이터 삭제. 검증 환경에서 먼저 확인
retention_keep_table = false로 잘못 설정DROP 후 복구 불가. 처음에는 true + archive 스키마 권장
매우 큰 파티션을 DROPDROP은 빠르지만 자체 락 잡음. 짧은 점검 시간에
premake가 작음새 파티션 생성이 늦어 INSERT 실패 가능. 보통 5+
백그라운드 워커 실패 추적로그(logging_collector)로 감지
경고

프로덕션에서 retention drop을 켜기 전, 적어도 한 주기 동안 retention_keep_table = true로 동작 확인. 잘못 설정된 retention으로 데이터를 실수로 날린 사고가 가장 흔한 pg_partman 사고입니다.

정리​

pg_partman은 선언적 파티션의 표준 자동화 도구로 PGDG 패키지로 설치합니다. create_parent로 부모를 등록하고 run_maintenance로 정기 유지보수하며, 백그라운드 워커 pg_partman_bgw를 쓰면 cron 없이 자동으로 돕니다.

  • retention 정책으로 DROP·DETACH 자동 — 처음엔 archive 스키마로 안전망
  • 작은 시스템은 자체 cron + SQL도 가능하나 pg_partman이 정석
  • premake은 최소 5로 INSERT 실패 방지