본문으로 건너뛰기
11.2 pg_dump / pg_restore

11.2 pg_dump / pg_restore

pg_dump은 PostgreSQL의 표준 논리 백업 도구입니다. 한 데이터베이스의 스키마와 데이터를 SQL 또는 custom 포맷으로 내보냅니다. 단순하고 이식성이 좋아 작은 DB·마이그레이션·부분 복제에 표준입니다. PITR 같은 시간 기반 복구는 못 합니다.

출력 포맷

포맷-F특징
plain SQLp (기본)사람이 읽기 좋음. psql로 복원
customc압축 + pg_restore로 선택 복원
directoryd여러 파일로 — 병렬 dump·restore
tart단일 파일, 압축 가능

운영 표준: 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 SQLpsql < dump.sql 또는 psql -f dump.sql
custom / directory / tarpg_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 — 새 버전 도구 권장
운영 시간에 큰 dumpxmin 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**을 봅니다.