8단계
백업 · 복원 리허설
25 분
백업 · 복원 리허설
"한 번도 복원해 본 적 없는 백업" 은 백업이 아닙니다. 월 1 회 리허설이 진짜 안전망.
1. pg_dump 기본
pg_dump \
--host=localhost --port=5432 --username=postgres --dbname=mydb \
--no-owner --no-privileges --format=custom \
--file=mydb-2026-05-06.dump
--format=custom— 압축 + 병렬 복원 가능--no-owner·--no-privileges— 복원 시 권한 오류 회피
2. gzip 파이프 (sql 형식)
pg_dump --format=plain mydb | gzip > mydb.sql.gz
단순 · 가독성 좋지만 병렬 복원 불가.
3. 선택 백업 — 테이블 화이트리스트
pg_dump -t users -t posts -t comments mydb > user-data.sql
민감 데이터만 분리 · 주기 다르게 관리.
4. cron 자동화
# /etc/cron.d/pg-backup
0 2 * * * postgres /usr/local/bin/backup.sh
backup.sh:
#!/bin/bash
DATE=$(date +%Y-%m-%d)
pg_dump --format=custom --file=/backups/db-$DATE.dump mydb
find /backups -name "db-*.dump" -mtime +7 -delete # 7일 이상 삭제
매일 02:00 · 7일 retention.
5. 복원
pg_restore --dbname=mydb --clean --if-exists mydb.dump
--clean 은 기존 테이블 DROP 후 재생성. 운영 DB 에 직접 금지. 테스트 DB 에서만.
6. Point-in-time Recovery (PITR)
"2 일 전 오후 3 시 상태로" 가 필요하면 pg_dump 로 불충분.
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal/%f'
pg_basebackup + WAL archiving. 복구 시 recovery.conf 로 시점 지정. 운영 복잡 · 저장 공간 큰 편.
7. 물리 복제 (streaming replication)
standby 서버가 master 의 WAL 을 실시간 재생. 장애 시 즉시 전환.
# standby
primary_conninfo = 'host=master port=5432 user=replicator'
백업과 독립. 둘 다 운영 권장.
8. 월 1 회 복원 리허설
# 다른 서버 · 다른 PG
docker run -d --name pg-restore-test -e POSTGRES_PASSWORD=x -p 5433:5432 postgres:15
docker cp mydb.dump pg-restore-test:/tmp/
docker exec pg-restore-test pg_restore --dbname=postgres --create /tmp/mydb.dump
테이블 건수 · 행 수 · 샘플 레코드 무결성 확인. 30 분 안에 끝.
9. 암호화 · 오프사이트
- 암호화 —
gpg --symmetric또는 cloud 저장소의 SSE - 오프사이트 — S3 · GCS · 다른 지역. 같은 서버 디스크 유실이 최대 위협
pg_dump ... | gzip | gpg --symmetric --passphrase-file /etc/backup.key | \
aws s3 cp - s3://my-backups/db-$(date +%Y-%m-%d).sql.gz.gpg
10. 자주 걸리는 자리
- pg_dump 버전 ≠ 서버 — major 버전 맞추거나 client ≥ server
- 디스크 full 후 복원 시 — 덤프 파일 자체가 손상
- 복원 테스트 안 함 — 정작 사고 시 포맷 · 권한 · 확장 충돌로 실패
- 화이트리스트 누락 — 중요 테이블 빠진 채 "백업 중" 안심
- 암호화 키 분실 — 백업 있어도 못 연다
11. 운영 체크리스트
- 매일 자동 cron 백업
- 7일 이상 retention (또는 정책 명시)
- 오프사이트 복제 (S3 · 다른 리전)
- 암호화 (at rest · in transit)
- 월 1 회 복원 리허설 (다른 서버)
- WAL archiving (PITR 필요 시)
하고픈 말
백업은 "설정하고 잊으면 안 되는 것". 복원 리허설까지 한 순간 진짜 안전망이 됩니다. 월 1 회 30 분이 장기적으로 가장 값진 투자.
Next
- architecture-patterns/01-monorepo-vs-polyrepo
🎉 PostgreSQL 깊게 다루기 + Redis · Kafka 완주를 축하해요
이어서 어떤 걸 배워 볼까요?