데이터베이스 백업은 데이터 손실이나 장애 발생 시 복구할 수 있도록 데이터의 사본을 만드는 프로세스다. 효과적인 백업 전략은 RTO(복구 목표 시간), RPO(복구 목표 지점)를 기반으로 설계한다.
핵심 지표
RPO (Recovery Point Objective): 허용 가능한 최대 데이터 손실 기간
예: RPO = 1시간 → 최대 1시간치 데이터 손실 허용
RTO (Recovery Time Objective): 목표 복구 시간
예: RTO = 4시간 → 장애 후 4시간 내 서비스 재개
백업 비용 ↑ ←→ RPO/RTO ↓ (더 엄격)
백업 유형
| 유형 | 설명 | 장점 | 단점 |
|---|
| 전체 백업 | 전체 데이터 복사 | 복구 간단 | 시간/용량 많이 필요 |
| 증분 백업 | 마지막 백업 이후 변경분 | 빠름, 작음 | 복구 시 여러 백업 필요 |
| 차등 백업 | 마지막 전체 이후 변경분 | 증분보다 복구 빠름 | 시간이 갈수록 크기 증가 |
| WAL 아카이빙 | 연속 로그 백업 | 임의 시점 복구 | 복잡한 설정 |
bash
# 논리적 백업 (pg_dump)
pg_dump -h localhost -U postgres mydb > backup.sql
pg_dump -Fc mydb > backup.dump # 압축 커스텀 포맷
# 복원
psql -U postgres mydb < backup.sql
pg_restore -d mydb backup.dump
# 물리적 백업 (pg_basebackup)
pg_basebackup -h localhost -U replication -D /backup/base -Ft -z -P
# PITR (Point-in-Time Recovery) 설정
# postgresql.conf:
archive_mode = on
archive_command = 'cp %p /wal_archive/%f'
# 특정 시점으로 복구
# recovery.conf:
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2024-01-15 14:30:00'
3-2-1 백업 규칙
3: 데이터 복사본 3개
2: 서로 다른 2가지 미디어/시스템에 저장
1: 최소 1개는 오프사이트(지리적으로 다른 위치)에 보관
예:
- 운영 DB (원본)
- 온프레미스 백업 서버 (다른 스토리지)
- AWS S3 (오프사이트 클라우드)
백업 자동화 스크립트
bash
# !/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/postgres"
# 전체 백업
pg_dump -Fc mydb > "$BACKUP_DIR/full_$DATE.dump"
# S3 업로드
aws s3 cp "$BACKUP_DIR/full_$DATE.dump" s3://my-backups/postgres/
# 7일 이상 된 로컬 백업 삭제
find $BACKUP_DIR -name "*.dump" -mtime +7 -delete
# 백업 검증
pg_restore --list "$BACKUP_DIR/full_$DATE.dump" > /dev/null && echo "백업 검증 성공"
관련 개념