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

Navigation

  • Intro
  • Blog
  • Life

연락하기

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

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

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›data

백업과 복구

2026-04-28 게시· 2026-05-18 갱신·0회 조회

백업과 복구

데이터를 만드는 것이 백업이 아닙니다. 되살려 봐야 백업입니다. 그 차이는 사고 후에야 드러납니다. PostgreSQL 의 도구·정책·리허설을 정리합니다.

1. 백업의 종류

PostgreSQL 백업은 두 갈래로 나뉩니다.

종류 형식 도구 특징
Logical SQL · 커스텀 아카이브 pg_dump · pg_dumpall · pg_restore 테이블·스키마 단위 가능. 버전·아키텍처 이식 가능. 큰 DB 에 시간이 오래 걸립니다.
Physical 데이터 디렉토리 파일 복사 pg_basebackup · 파일 시스템 스냅샷 + WAL 복구가 빠릅니다. 동일 메이저 버전·동일 아키텍처에서만 호환됩니다.

logical 은 운영 백업의 기본입니다. physical 은 PITR 의 베이스를 만드는 자리에서 자주 등장합니다.

2. pg_dump · pg_dumpall · pg_restore

pg_dump 는 한 DB 의 logical 백업을 만듭니다. SQL 텍스트로도, 커스텀 아카이브(-Fc)·디렉토리 형식(-Fd) 으로도 출력할 수 있습니다.

pg_dump -Fc -d mydb -f mydb.dump
pg_restore -d mydb_new mydb.dump

-Fc 는 압축·병렬 복원·선택 복원이 가능해 운영에서 가장 자주 권장되는 형식입니다.

pg_dumpall 은 클러스터 전체를 묶어 받습니다. role · tablespace · 모든 DB 가 한 번에 들어가는 대신 데이터는 SQL 텍스트로만 나옵니다. pg_restore 는 pg_dump 의 커스텀·디렉토리 형식을 복원하며 -j 로 병렬 복원이 됩니다.

3. WAL 아카이빙

PostgreSQL 은 모든 변경을 트랜잭션 로그(WAL) 에 먼저 씁니다. 이 로그를 별도 저장소로 계속 옮겨 보관하면 어느 시점의 풀 백업 + WAL 누적으로 임의 시점의 상태를 다시 만들 수 있습니다.

설정의 핵심은 셋입니다.

wal_level = replica
archive_mode = on
archive_command = 'cp %p /mnt/wal-archive/%f'

archive_library 로 갈음할 수도 있습니다. 이렇게 보관된 WAL 이 PITR 의 입력입니다.

4. PITR — Point-In-Time Recovery

PITR 의 흐름은 6 단계입니다.

① 베이스 백업(pg_basebackup) 주기적 생성
② WAL 아카이브 빈틈없이 보관
③ 사고 시: 베이스 백업을 빈 데이터 디렉토리에 복원
④ recovery.signal 파일 생성 + restore_command 설정
⑤ recovery_target_time (또는 _lsn · _xid) 으로 도달 시점 지정
⑥ Postgres 시작 → WAL 재생 → 목표 도달 시 정지

베이스 백업의 시점에서 출발하므로 베이스가 멀수록 재생이 길어집니다. 베이스 백업 주기·WAL 보존 정책이 RPO·RTO 를 결정합니다.

  • RPO (Recovery Point Objective) — 허용 가능한 데이터 손실. WAL 전송 주기·지연이 영향.
  • RTO (Recovery Time Objective) — 복구에 허용 가능한 시간. 베이스 빈도·하드웨어·WAL 양이 영향.

PITR 자체가 RPO 를 0 에 가깝게 만들지는 않습니다. 동기 복제 standby 가 추가로 필요한 자리도 있습니다.

5. 운영 도구

직접 archive_command 를 묶어 운영하기보다 도구를 쓰는 편이 흔합니다.

pgBackRest — C 로 작성. 병렬 압축·증분 백업·암호화·S3 호환 저장소를 직접 지원합니다. 운영의 정공법으로 가장 자주 추천됩니다.

Barman — EnterpriseDB 후원. Python 기반. 풀·증분·WAL 스트리밍 모두 지원합니다.

WAL-G — Citus·Yandex 가 시작. WAL 압축·암호화·클라우드 저장소(S3 · GCS · Azure Blob) 친화. 운영 표면이 작은 점이 강점입니다.

클라우드 매니지드 — Amazon RDS · Aurora · Cloud SQL · Azure Database 는 자동 백업·PITR 을 매니지드로 제공합니다. 운영자는 보관 기간·복원 절차에 집중하면 됩니다. 한계는 복원 결과가 새 인스턴스가 되는 점·플랫폼 잠금입니다.

6. 3-2-1 보관 규칙

전통적인 백업 보관 권고입니다.

  • 3 개의 사본
  • 2 가지 매체 (로컬 디스크 + 객체 저장소 등)
  • 1 개는 오프사이트 (다른 리전·다른 클라우드·물리적 다른 장소)

원격 사본의 의미는 데이터센터 장애·랜섬웨어 같은 광범위 사고에서 드러납니다.

보관 기간은 보통 일일 1430 일 · 주간 812 주 · 월간 12 개월 · 연간 3~7 년 (법규·계약에 따라). 쌓인 백업은 비용이라 정책을 코드로 자동 정리하는 편이 안전합니다.

7. 암호화 · 키 관리

  • 전송 중: TLS.
  • 저장 시: 서버측 암호화 또는 클라이언트측 GPG · age.
  • 키 관리: KMS · Vault · 클라우드 Key Service.

복원 리허설 단계에서 키 접근 권한까지 같이 점검합니다. 키를 잃으면 암호화 백업은 복원할 수 없습니다.

8. 복원 리허설

가장 흔한 사고는 "백업은 있는데 복원이 안 됐다" 입니다. 정기적인 리허설로 막습니다.

① 다른 환경에 베이스 백업 + WAL 로 PITR
② 결과 DB 의 행 수·체크섬 검증
③ 애플리케이션 스모크 테스트
④ 소요 시간 기록 → RTO 검증

리허설 자체를 자동화한 운영 사례도 흔합니다.

9. 복제는 백업이 아닙니다

streaming replication 은 장애 조치의 도구입니다. logical replication 은 메이저 버전·스키마 이전의 도구입니다. 둘 다 백업은 아닙니다.

사용자가 의도적으로 또는 실수로 데이터를 지우면 복제본도 같이 지워집니다. 시점 복구 능력은 PITR 가 가지고 있습니다. 디스크 스냅샷(EBS · ZFS) 은 빠른 백업·복원이 강점이지만 일관성 있는 스냅샷을 위해서는 pg_backup_start / pg_backup_stop (PostgreSQL 15+) 흐름이 필요합니다.

10. 자주 걸리는 자리

pg_dump 만 가지고 만족하기 — DB 가 커지면 dump · restore 가 시간 단위로 늘어집니다. PITR 에는 부적합합니다.

WAL 아카이브 누락 구간 — archive_command 가 일시적으로 실패하면 PITR 가 끊깁니다. 모니터링이 필수입니다.

백업 완료 알람만 보고 안심하기 — 알람은 "파일이 만들어졌다" 만 알려줄 수도 있습니다. 무결성 검사·복원 리허설로 보완합니다.

버전·플랫폼 호환 — physical 백업은 같은 메이저 버전·같은 아키텍처에서만 복원됩니다. logical 백업은 그 가정이 느슨합니다.

확장(extension) 의존 — 복원 환경에 같은 extension 이 없으면 실패합니다. 환경 빌드 단계에 명시합니다.

재해 시점의 권한 부재 — 평소에 백업 접근 권한이 사람에게 닫혀 있어 사고 시 복구가 막히는 경우가 있습니다. 사람·역할 분리·비상 절차 문서화가 필요합니다.

하고픈 말

백업은 만들기보다 되살리기 어렵습니다. 도구를 고르는 시간보다 리허설에 시간을 더 씁니다. PITR 까지 갈지 일일 dump 로 충분할지는 RPO 가 결정해 줍니다.

Next

  • multi-pg-pool-orchestration
  • postgres-deep

PostgreSQL Backup and Restore · Continuous Archiving and PITR · pgBackRest 공식 · WAL-G GitHub 를 참고합니다.

data 카테고리의 다른 글

카테고리 전체 보기 →
  • DB 시드 소스를 코드 트리 안에 두지 않는다
  • Supabase Storage — 파일 업로드와 권한
  • Kafka 실무 — 토픽 설계와 메시지 흐름
  • 여러 PostgreSQL 풀 한 앱에서 관리하기
  • 이미지 파이프라인
  • 푸시 알림 — FCM 과 Web Push