[PostgreSql] 로그 테이블(파티션) 백업 및 DROP 방법 (로그 테이블에서 DELETE 하면 DB 터집니다.
[PostgreSql] 로그 테이블(파티션) 생성 방안 (파티션 + 6개월 자동 삭제 + 인덱스 + 페이징 조회) 이 글에 이어서 기록되는 내용입니다.
백업 후 DROP 전략 (가장 안전한 방법)
방법 A — 파티션 단위 CSV 백업 (가장 많이 씀)
COPY TB_APP_LOG_2025_01
TO '/backup/TB_APP_LOG_2025_01.csv'
DELIMITER ','
CSV HEADER;
→ 월별 파티션 단위로 백업
→ 이후 바로 DROP 가능
DROP TABLE TB_APP_LOG_2025_01;
방법 B — SQL 백업 (pg_dump)
pg_dump -t TB_APP_LOG_2025_01 mydb > TB_APP_LOG_2025_01.sql
복구:
psql mydb < TB_APP_LOG_2025_01.sql
방법 C — DB 내부 백업 테이블
CREATE TABLE TB_APP_LOG_2025_01_BAK AS
SELECT * FROM TB_APP_LOG_2025_01;
특정 기간만 남기고 정리 (파티션 기준)
예: 최근 6개월만 유지
DROP TABLE IF EXISTS TB_APP_LOG_2025_01;
DROP TABLE IF EXISTS TB_APP_LOG_2025_02;
DROP TABLE IF EXISTS TB_APP_LOG_2025_03;
👉 파티션이면 DELETE보다 DROP이 100배 빠름
자동 정리 SQL (월 기준 계산)
DO $$
DECLARE
v_limit_date DATE := date_trunc('month', now() - interval '6 months');
r RECORD;
BEGIN
FOR r IN
SELECT relname
FROM pg_class
WHERE relname LIKE 'tb_app_log_%'
LOOP
IF substring(r.relname from 12 for 7)::date < v_limit_date THEN
EXECUTE format('DROP TABLE IF EXISTS %I', r.relname);
END IF;
END LOOP;
END $$;
pg_cron 자동 정리 스케줄
SELECT cron.schedule(
'log_partition_cleanup',
'0 3 1 * *',
$$DO $$
DECLARE
v_limit_date DATE := date_trunc('month', now() - interval '6 months');
r RECORD;
BEGIN
FOR r IN
SELECT relname
FROM pg_class
WHERE relname LIKE 'tb_app_log_%'
LOOP
IF substring(r.relname from 12 for 7)::date < v_limit_date THEN
EXECUTE format('DROP TABLE IF EXISTS %I', r.relname);
END IF;
END LOOP;
END $$;$$
);
👉 매월 1일 새벽 3시
👉 6개월 초과 파티션 자동 삭제
실무 운영 정책 예시
| 항목 | 정책 |
|---|---|
| 온라인 조회 | 최근 3개월 |
| DB 보관 | 최근 6개월 |
| CSV 백업 | 1년 |
| DROP | 파티션 단위 |
실무 한 줄 요약
로그 테이블은
DELETE ❌
DROP PARTITION ✅
운영 체크리스트
SELECT relname
FROM pg_class
WHERE relname LIKE 'tb_app_log_%'
ORDER BY relname;
이 결과 보고
→ 삭제 대상만 DROP
절대 하면 안 되는 것
DELETE FROM TB_APP_LOG WHERE created_at < ...
👉 로그 테이블에서 이거 하면 DB 터집니다.
🎯 결론
✔ 백업 → DROP
✔ 기간 기준 → 파티션 DROP
✔ pg_cron 자동화
✔ DELETE 금지



