codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
에듀›PostgreSQL 깊게 다루기 + Redis · Kafka›8단계

8단계

백업 · 복원 리허설

0회 조회

백업 · 복원 리허설

"한 번도 복원해 본 적 없는 백업" 은 백업이 아닙니다. 월 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

← 7단계

데이터 파이프라인 — 재시도 · 멱등

9단계 →

9단계 — Kafka 토픽 설계