백엔드 데이터 인프라 46편 — 백업과 복구 pg_dump·PITR

2026-05-17백엔드 데이터 인프라

백엔드 데이터 인프라 46편. PostgreSQL 백업·복구 — pg_dump 논리 백업·pg_basebackup 물리 백업·PITR 표준 풀어쓴 학습 노트.

📚 백엔드 데이터 인프라 · 46편 — 백업과 복구 pg_dump·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 분 단위.

백업 모범 사례

  1. 자동화 — 수동 백업은 잊음
  2. 다중 위치 — 같은 데이터센터 X (S3 + 다른 리전)
  3. 암호화 — 백업 데이터도 민감
  4. 보존 정책 — 일·주·월·년 단위 단계
  5. 정기 검증 — 분기별 복원 훈련

함정 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 자동 백업 + 분기 검증

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!