백엔드 데이터 인프라 46편. PostgreSQL 백업·복구 — pg_dump 논리 백업·pg_basebackup 물리 백업·PITR 표준 풀어쓴 학습 노트.
이 글은 백엔드 데이터 인프라 시리즈 70편 중 46편이에요. Part 3 운영의 마지막. PG 운영의 가장 마지막 안전망 — 백업·복구.
백업 3가지 전략
| 방식 | 도구 | 특징 |
|---|---|---|
| 논리 백업 | pg_dump | SQL/이진 덤프, 유연 |
| 물리 백업 | pg_basebackup | 디스크 통째, 빠른 복원 |
| PITR | base + WAL 아카이브 | 어느 시점이든 복원 |
운영 표준 = PITR + 주기적 pg_dump.
pg_dump — 논리 백업
# 한 DB 덤프 (SQL 형식)
pg_dump -h source -U postgres mydb > mydb.sql
# Custom 형식 (압축, 권장)
pg_dump -h source -U postgres -Fc mydb > mydb.dump
# Directory 형식 (병렬 가능)
pg_dump -h source -U postgres -Fd -j 4 mydb -f mydb.d
| 형식 | 단축 | 특징 |
|---|---|---|
-Fp plain SQL |
기본 | 텍스트, 큰 용량 |
-Fc custom |
권장 | 압축, 부분 복원 |
-Fd directory |
병렬 덤프·복원 | |
-Ft tar |
tar 아카이브 |
옵션
pg_dump -Fc \
--schema=public \ # 특정 스키마만
--table=users \ # 특정 테이블만
--exclude-table=logs_* \ # 제외
--no-owner --no-privileges \ # 권한 정보 제외 (다른 환경 복원)
--jobs=4 \ # 병렬 (-Fd 만)
mydb > mydb.dump
pg_restore
# Custom 형식 복원
pg_restore -h target -U postgres -d newdb -j 4 mydb.dump
# 옵션
pg_restore -j 4 \
--no-owner --no-privileges \
--clean --if-exists \ # 기존 객체 삭제 후
--create \ # CREATE DATABASE 도
-d postgres mydb.dump
pg_dumpall — 클러스터 전체
pg_dumpall -h source -U postgres > all.sql
모든 DB와 ROLE, 글로벌 객체까지 한 번에 받는다. 전체 마이그레이션 때 쓰는 카드.
pg_basebackup — 물리 백업
pg_basebackup -h source -U replicator -D /backup/base -Fp -P
특징: - 디스크 파일 통째 복사 (큰 용량) - 매우 빠른 복원 (압축 풀고 시동) - 같은 PG 버전·OS 만 - WAL(트랜잭션 로그)도 같이 받아 PITR 의 기반이 된다
PITR — Point-In-Time Recovery
가장 강력한 운영 백업. 어느 시점이든 복원 가능.
1단계 — WAL 아카이빙
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'aws s3 cp %p s3://my-bucket/wal/%f'
archive_timeout = 60s
WAL 가 S3 (또는 디스크) 에 아카이브.
2단계 — base backup
pg_basebackup -D /backup/base -Fp
# 또는 WAL-G·pgBackRest 같은 도구
3단계 — 복구 시점 지정
# 1. base 압축 풀기
tar -xzf base.tar.gz -C /var/lib/postgresql/data
# 2. recovery.signal 파일
touch /var/lib/postgresql/data/recovery.signal
# 3. postgresql.conf 에
restore_command = 'aws s3 cp s3://my-bucket/wal/%f %p'
recovery_target_time = '2026-05-17 14:30:00 KST'
recovery_target_action = 'promote'
# 4. PG 시동
systemctl start postgresql
PG 가 base 를 먼저 복원하고, WAL 을 차례로 적용해 지정한 시점까지 따라간다. 그 순간의 정확한 상태로 돌아오는 셈.
도구 — WAL-G·pgBackRest
운영 = 직접 명령 X. 백업 도구 사용.
WAL-G
# 환경 변수
export WALG_S3_PREFIX=s3://my-bucket/wal
export AWS_REGION=ap-northeast-2
# 백업
wal-g backup-push /var/lib/postgresql/data
# 복원
wal-g backup-fetch /var/lib/postgresql/data LATEST
장점 — S3 통합·압축·차분 백업·간단.
pgBackRest
# pgbackrest.conf
[main]
pg1-path=/var/lib/postgresql/data
repo1-path=/backup
repo1-retention-full=2
pgbackrest --stanza=main backup
pgbackrest --stanza=main restore --type=time --target='2026-05-17 14:30:00'
장점 — 더 풍부한 기능·증분 백업·검증.
규모 큰 운영이면 pgBackRest 나 WAL-G 에 사내 S3 를 붙여 쓴다.
RDS 자동 백업
RDS 는 별 노력 없이 PITR 가 돌아간다.
설정 → backup_retention_period = 7 # 7일 자동 보존
설정 → preferred_backup_window # 백업 시간대
복원:
AWS Console → RDS → Restore to Point in Time → 2026-05-17 14:30:00 → 새 인스턴스
새 인스턴스로 복원한 다음 검증, DNS 변경, 원본 폐기 순서로 간다.
Aurora — 한 단계 더
Aurora = 지속적 백업 + Backtrack (시간 되돌리기, 분 단위).
aws rds backtrack-db-cluster \
--db-cluster-identifier prod-cluster \
--backtrack-to '2026-05-17T14:30:00Z'
새 인스턴스를 만들지 않고 현재 클러스터를 시간 되돌리기로 처리한다. 매우 빠르고 간단.
백업 검증
# 1. 백업
pg_basebackup -D /backup/$(date +%Y%m%d) ...
# 2. 별도 PG 인스턴스에 복원
pg_ctl -D /test/restore start
# 3. 검증
psql -h test -c "SELECT COUNT(*) FROM users;"
psql -h test -c "SELECT * FROM critical_table LIMIT 1;"
# 4. 정리
pg_ctl -D /test/restore stop
백업은 검증 안 하면 무의미. 운영 표준 = 분기별 복원 훈련.
백업 RPO·RTO
| RPO (데이터 손실 허용) | RTO (다운타임 허용) | |
|---|---|---|
| 하루 1회 pg_dump | 24시간 | 수 시간 |
| 시간 1회 pg_dump | 1시간 | 수 시간 |
| PITR (WAL 1분) | 1분 | 수 시간 |
| Multi-AZ + PITR | 1분 | 30~60초 |
| Aurora + Backtrack | 분 단위 | 분 단위 |
Multi-AZ 는 여러 가용 영역에 복제본을 두는 구성이다. 운영은 비즈니스 요구에 맞춰 정한다. 금융·결제 = RPO 0·RTO 분 단위.
백업 모범 사례
- 자동화 — 수동 백업은 잊음
- 다중 위치 — 같은 데이터센터 X (S3 + 다른 리전)
- 암호화 — 백업 데이터도 민감
- 보존 정책 — 일·주·월·년 단위 단계
- 정기 검증 — 분기별 복원 훈련
함정 5가지
(1) 백업 검증 안 함
복원 실패 = 백업 무의미. 정기 훈련.
(2) RPO·RTO 모름
비즈니스 요구 무시한 백업 정책 = 사고 시 폭주.
(3) WAL 아카이브 실패
archive_command 가 실패하면 WAL 이 누적되고, 디스크가 차서 PG 가 다운된다. 모니터링과 알람 필수.
(4) 백업 데이터 평문
S3 에 평문 = 유출 시 큰 사고. 암호화 무조건.
(5) RDS·Aurora 자동 백업 비활성화
비용 아끼려 비활성화 = 사고 시 복구 불가. 최소 7일.
(1) RDS 또는 PITR. (2) WAL-G·pgBackRest 도구. (3) 다중 위치(S3). (4) 분기별 복원 훈련. (5) 보존 정책(일·주·월·년).
한 줄 정리 — 백업 3전략 = 논리(pg_dump)·물리(pg_basebackup)·PITR. 운영 = WAL-G·pgBackRest + S3. RDS = 자동 PITR. Aurora = Backtrack. RPO·RTO 비즈니스에 맞춰. 백업 검증 없으면 의미 없음.
시험 직전 한 번 더 — 백업 입문자가 매번 헷갈리는 것
- 백업 3종 = 논리·물리·PITR
- pg_dump -Fc = 운영 표준 (custom)
- pg_dumpall = 클러스터 전체 (ROLE 포함)
- pg_restore -j 4 = 병렬 복원
- pg_basebackup = 물리 백업 (디스크 통째)
- WAL 같이 받아야 PITR 기반
- PITR = Point-In-Time Recovery
- WAL 아카이빙 =
archive_command - recovery_target_time = 복구 시점
- recovery.signal 파일
- restore_command = WAL 복원
- WAL-G = S3 통합 도구
- pgBackRest = 더 풍부한 기능
- RDS 자동 백업 = backup_retention_period
- Aurora Backtrack = 시간 되돌리기 (인스턴스 새로 X)
- RPO = 데이터 손실 허용 (분 단위 ↔ 일 단위)
- RTO = 다운타임 허용
- 백업 검증 = 분기별 복원 훈련
- 다중 위치 = S3 + 다른 리전
- 암호화 무조건
- 보존 정책 = 일·주·월·년 단계
- archive_command 실패 = 디스크 풀
- 백업 모니터링 + 알람
- 한국 운영 = RDS 자동 백업 + 분기 검증
시리즈 다른 편 (앞뒤 글 모음)
이전 글:
- 41편 — 성능 팁 종합
- 42편 — 운영 설치 바이너리·Docker·관리 서비스
- 43편 — postgresql.conf 핵심 설정
- 44편 — 사용자·역할 관리 CREATE ROLE GRANT
- 45편 — 데이터베이스 관리 생성·복제·드롭
다음 글: