11.2 pg_dump / pg_restore
pg_dump은 PostgreSQL의 표준 논리 백업 도구입니다. 한 데이터베이스의 스키마와 데이터를 SQL 또는 custom 포맷으로 내보냅니다. 단순하고 이식성이 좋아 작은 DB·마이그레이션·부분 복제에 표준입니다. PITR 같은 시간 기반 복구는 못 합니다.
출력 포맷
| 포맷 | -F | 특징 |
|---|---|---|
| plain SQL | p (기본) | 사람이 읽기 좋음. psql로 복원 |
| custom | c | 압축 + pg_restore로 선택 복원 |
| directory | d | 여러 파일로 — 병렬 dump·restore |
| tar | t | 단일 파일, 압축 가능 |
운영 표준: directory 포맷 + 병렬이 가장 빠르고 유연.
pg_dump -Fd -j 4 -Z 9 app_main -f /backup/app_main_2026-05-23
# -Fd directory format
# -j 4 병렬 워커 4개
# -Z 9 zstd 최대 압축 (PG 16+에서 zstd 지원, 그 전엔 gzip)자주 쓰는 옵션
pg_dump app_main > app_main.sql # 가장 단순
pg_dump -Fc app_main > app_main.dump # custom
pg_dump -Fd -j 4 app_main -f app_main_dir/ # directory + 병렬
pg_dump -t orders -t order_items app_main > tables.sql # 일부 테이블
pg_dump -s app_main > schema.sql # 스키마만
pg_dump -a app_main > data.sql # 데이터만
pg_dump -n public app_main > public_only.sql # 한 스키마
pg_dump --no-owner --no-acl app_main > portable.sql # 권한 없이 — 마이그레이션용트랜잭션 일관성
pg_dump는 Repeatable Read 트랜잭션을 자동으로 시작해 일관된 스냅샷을 보장한다 — dump 도중 다른 트랜잭션의 변경이 섞이지 않습니다.
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 모든 SELECT가 같은 스냅샷
COMMIT;병렬 dump (-j N)는 synchronized snapshot을 사용해 워커들이 같은 스냅샷을 공유. 일관성 깨지지 않음.
큰 객체 (BLOB)
pg_largeobject 카탈로그의 LO. pg_dump가 기본으로 포함합니다.
pg_dump --large-objects app_main # PG 16+ 권장 옵션 (`-b`도 OK)복원 — psql vs pg_restore
| 포맷 | 복원 |
|---|---|
| plain SQL | psql < dump.sql 또는 psql -f dump.sql |
| custom / directory / tar | pg_restore |
pg_restore의 장점:
- 병렬 복원 (
-j N) - 선택 복원 (
--table=) - 인덱스·트리거를 데이터 후에 적용 — 더 빠름
- 의존성 자동 해결
# 기본 복원
pg_restore -d new_db -j 4 app_main_dir/
# 일부 테이블만
pg_restore -d new_db -t orders app_main_dir/
# 스키마만 먼저
pg_restore -d new_db -s app_main_dir/
# 데이터만 (스키마는 이미 있음)
pg_restore -d new_db -a app_main_dir/
# 인덱스·constraint 제외
pg_restore -d new_db --no-indexes app_main_dir/복원 속도 팁
빈 DB에 큰 dump를 복원할 때:
| 팁 | 효과 |
|---|---|
pg_restore -j N 병렬 | 큰 효과 (N = vCPU 수) |
wal_level = minimal (재시작 필요) | unlogged 비슷한 효과 |
max_wal_size = 32GB | 체크포인트 감소 |
maintenance_work_mem = 4GB | 인덱스 빌드 빠름 |
synchronous_commit = off | 일시적 — 사고 시 일부 손실 OK |
fsync = off | 절대 금지 (이미 깬 클러스터엔 OK, 운영 금지) |
archive_mode = off | 임시 (운영 클러스터 아님) |
ETL·복원 끝나면 원래 설정으로 돌리고 ANALYZE 명시 호출합니다.
pg_dumpall — 클러스터 전체
pg_dump은 한 DB만. 전체 클러스터(역할·tablespace·여러 DB)는 pg_dumpall:
pg_dumpall > cluster.sql # 전체
pg_dumpall --globals-only > globals.sql # 역할·tablespace만운영 표준 패턴:
pg_dumpall --globals-only > globals.sql
for db in $(psql -At -c "SELECT datname FROM pg_database WHERE datistemplate = false"); do
pg_dump -Fd -j 4 "$db" -f "/backup/$db"
done이렇게 하면 globals + 각 DB 별 directory dump가 만들어집니다.
운영 시 주의
| 주의 | 메모 |
|---|---|
| pg_dump 중 모든 트랜잭션이 read만 보임 | 일관 스냅샷이라 dump 중 vacuum 진행 어려움 — xmin horizon 잡음 |
| 큰 DB는 dump 시간이 시간 단위 | 그 시간 동안 dead tuple 누적 |
| 메이저 버전 차이 | 새 버전 도구로 dump (예: PG 17이 16 DB dump 가능, 반대는 X) |
pg_restore의 --single-transaction | 실패 시 자동 ROLLBACK — 안전 |
| Large object 누락 | -b 또는 --large-objects |
| 시퀀스 현재값 누락 | 기본 포함되지만 일부 옵션 조합에서 빠짐 — 확인 |
directory 포맷의 매력
app_main_dir/
├── toc.dat # 메타데이터
├── 1.dat.zst # 한 객체의 데이터
├── 2.dat.zst
└── ...- 객체 단위로 병렬 read/write
- 부분 복원 쉬움
- 압축 별로
pg_restore의-l로 객체 목록·필터링
자동화
#!/bin/bash
DATE=$(date +%Y-%m-%d)
DEST=/backup/pg_dump/$DATE
mkdir -p $DEST
pg_dumpall --globals-only > $DEST/globals.sql
for db in $(psql -At -c "SELECT datname FROM pg_database WHERE datistemplate = false"); do
pg_dump -Fd -j 4 -Z 9 "$db" -f "$DEST/$db" || exit 1
done
# 14일 전 dump 정리
find /backup/pg_dump -mindepth 1 -maxdepth 1 -mtime +14 -exec rm -rf {} \;
# 외부 객체 저장소 동기화
aws s3 sync /backup/pg_dump/$DATE s3://my-pg-backups/pg_dump/$DATE/cron 또는 systemd timer로 일 단위 자동입니다.
안티패턴
| 안티패턴 | 위험 |
|---|---|
pg_dump > /backup/dump.sql (gzip 안 함) | 디스크 폭주 |
| 같은 디스크에 dump 저장 | 디스크 사고 시 같이 사라짐 |
| dump 검증 안 함 | 복원 가능한지 모름 |
| 메이저 다른 버전의 pg_dump 사용 | format mismatch — 새 버전 도구 권장 |
| 운영 시간에 큰 dump | xmin horizon이 잡혀 vacuum 지연 |
pg_dump은 PITR이 안 된다. dump 시점만 복원. 분 단위 RPO가 필요하면 pgBackRest/Barman 같은 물리 백업이 답입니다.정리
- pg_dump = 논리 백업. 작은 DB·마이그레이션·부분 복제 표준
- 포맷은 directory + 병렬(
-Fd -j N)이 가장 유연·빠름 - pg_restore의 병렬·선택 복원 활용
- 클러스터 전체는 pg_dumpall (globals + 각 DB)
- PITR 불가 — 분 단위 RPO 필요하면 물리 백업
- 자동화 + 외부 객체 저장소 + 정기 복원 검증
다음 절(11.3)에서는 PostgreSQL이 기본 제공하는 물리 백업 도구 — **pg_basebackup**을 봅니다.