들어가며: 백업 없이는 데이터도 없다

데이터 손실은 언제든 발생할 수 있습니다. 하드웨어 장애, 인적 오류, 보안 침해, 자연재해 등 다양한 원인에 대비하는 백업 전략은 서버 운영의 필수입니다.

1. 백업 전략 수립

1.1 3-2-1 백업 규칙

# 3-2-1 규칙
- 3개의 데이터 복사본 유지
- 2개의 다른 저장 매체 사용
- 1개는 오프사이트(원격지)에 보관

1.2 백업 유형

# 전체 백업 (Full Backup)
- 모든 데이터 복사
- 복구 가장 쉬움
- 시간과 공간 많이 필요

# 증분 백업 (Incremental Backup)
- 마지막 백업 이후 변경된 파일만
- 빠르고 공간 효율적
- 복구 시 전체 + 모든 증분 필요

# 차등 백업 (Differential Backup)
- 마지막 전체 백업 이후 변경된 파일
- 중간 정도의 시간/공간
- 복구 시 전체 + 마지막 차등

2. tar를 이용한 백업

2.1 기본 백업

# 압축 백업 생성
tar -czvf backup_$(date +%Y%m%d).tar.gz /path/to/data

# 특정 디렉토리 제외
tar -czvf backup.tar.gz --exclude='*.log' --exclude='cache' /data

# 분할 압축 (대용량)
tar -cvf - /data | split -b 1G - backup_part_

# 압축 해제
tar -xzvf backup.tar.gz -C /restore/path

2.2 증분 백업

# 스냅샷 파일 사용 증분 백업
# 첫 번째 (전체)
tar -czvf full_backup.tar.gz -g /var/backup/snapshot.snar /data

# 두 번째 (증분)
tar -czvf incr_backup_1.tar.gz -g /var/backup/snapshot.snar /data

# 복구 (순서대로)
tar -xzvf full_backup.tar.gz -g /dev/null -C /restore
tar -xzvf incr_backup_1.tar.gz -g /dev/null -C /restore

3. rsync를 이용한 백업

3.1 로컬 동기화

# 기본 동기화
rsync -avh /source/ /backup/

# 삭제된 파일도 동기화
rsync -avh --delete /source/ /backup/

# 진행률 표시
rsync -avh --progress /source/ /backup/

# 테스트 (dry-run)
rsync -avhn /source/ /backup/

3.2 원격 백업

# SSH를 통한 원격 백업
rsync -avhz -e ssh /local/data/ user@remote:/backup/

# 대역폭 제한
rsync -avhz --bwlimit=1000 /data/ user@remote:/backup/

# 부분 전송 재개
rsync -avhz --partial --progress /data/ user@remote:/backup/

# 특정 SSH 키 사용
rsync -avhz -e "ssh -i ~/.ssh/backup_key" /data/ user@remote:/backup/

3.3 rsync 백업 스크립트

#!/bin/bash
# rsync_backup.sh

SOURCE="/home /etc /var/www"
DEST="/mnt/backup"
LOG="/var/log/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)

echo "=== 백업 시작: $DATE ===" >> $LOG

for dir in $SOURCE; do
    rsync -avh --delete \
        --exclude='*.tmp' \
        --exclude='cache' \
        "$dir" "$DEST" >> $LOG 2>&1
done

echo "=== 백업 완료: $(date +%Y%m%d_%H%M%S) ===" >> $LOG

4. 데이터베이스 백업

4.1 MySQL/MariaDB

# 전체 백업
mysqldump -u root -p --all-databases > all_db_$(date +%Y%m%d).sql

# 특정 데이터베이스
mysqldump -u root -p mydb > mydb_$(date +%Y%m%d).sql

# 압축 백업
mysqldump -u root -p mydb | gzip > mydb_$(date +%Y%m%d).sql.gz

# 복구
mysql -u root -p < backup.sql
gunzip < backup.sql.gz | mysql -u root -p mydb

4.2 PostgreSQL

# 전체 백업
pg_dumpall -U postgres > all_db_$(date +%Y%m%d).sql

# 특정 데이터베이스
pg_dump -U postgres mydb > mydb_$(date +%Y%m%d).sql

# 커스텀 포맷 (병렬 복구 가능)
pg_dump -U postgres -Fc mydb > mydb.dump

# 복구
psql -U postgres < backup.sql
pg_restore -U postgres -d mydb mydb.dump

5. 자동화된 백업

5.1 cron 설정

# crontab -e

# 매일 새벽 2시 전체 백업
0 2 * * * /root/scripts/daily_backup.sh

# 매주 일요일 전체 백업
0 3 * * 0 /root/scripts/weekly_backup.sh

# 매시간 증분 백업
0 * * * * /root/scripts/hourly_incremental.sh

5.2 종합 백업 스크립트

#!/bin/bash
# comprehensive_backup.sh

# 설정
BACKUP_DIR="/mnt/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
LOG="/var/log/backup.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG
}

# 백업 디렉토리 생성
mkdir -p "$BACKUP_DIR/$DATE"

log "백업 시작"

# 시스템 설정 백업
tar -czf "$BACKUP_DIR/$DATE/etc.tar.gz" /etc 2>/dev/null
log "시스템 설정 백업 완료"

# 웹 데이터 백업
tar -czf "$BACKUP_DIR/$DATE/www.tar.gz" /var/www 2>/dev/null
log "웹 데이터 백업 완료"

# MySQL 백업
mysqldump -u root --all-databases | gzip > "$BACKUP_DIR/$DATE/mysql.sql.gz"
log "MySQL 백업 완료"

# 오래된 백업 삭제
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
log "오래된 백업 정리 완료"

log "백업 완료"

6. 복구 절차

6.1 파일 복구

# tar 압축 해제
tar -xzvf backup.tar.gz -C /restore/path

# 특정 파일만 복구
tar -xzvf backup.tar.gz -C /restore path/to/file

# rsync 복구
rsync -avh /backup/data/ /restore/data/

6.2 시스템 복구

# 1. 라이브 USB/CD로 부팅
# 2. 파일시스템 마운트
mount /dev/sda1 /mnt

# 3. 백업에서 복구
tar -xzvf /backup/root.tar.gz -C /mnt

# 4. 부트로더 복구
grub-install --root-directory=/mnt /dev/sda

# 5. 재부팅

7. 복구 테스트

#!/bin/bash
# backup_verify.sh

BACKUP_FILE="$1"
TEST_DIR="/tmp/backup_test_$$"

mkdir -p "$TEST_DIR"

echo "백업 파일 검증 중: $BACKUP_FILE"

# 압축 무결성 확인
if tar -tzf "$BACKUP_FILE" > /dev/null 2>&1; then
    echo "압축 무결성: OK"
else
    echo "압축 무결성: FAILED"
    exit 1
fi

# 테스트 복구
tar -xzf "$BACKUP_FILE" -C "$TEST_DIR"
FILE_COUNT=$(find "$TEST_DIR" -type f | wc -l)
echo "복구된 파일 수: $FILE_COUNT"

# 정리
rm -rf "$TEST_DIR"
echo "검증 완료"

8. 클라우드 백업

# AWS S3 백업
aws s3 sync /data s3://mybucket/backup/

# Google Cloud Storage
gsutil rsync -r /data gs://mybucket/backup/

# rclone (다양한 클라우드 지원)
rclone sync /data remote:backup/

9. 재해 복구 계획 (DRP)

# 재해 복구 계획 체크리스트
1. 중요 데이터 식별 및 우선순위
2. RPO (복구 시점 목표) 정의
3. RTO (복구 시간 목표) 정의
4. 백업 위치 및 방법 문서화
5. 복구 절차 문서화
6. 정기적인 복구 테스트
7. 담당자 연락처 및 역할
8. 정기 검토 및 업데이트

마무리

백업은 서버 운영의 생명선입니다. 정기적인 백업, 복구 테스트, 그리고 재해 복구 계획을 통해 어떤 상황에서도 데이터를 보호할 수 있습니다. 마지막 편에서는 보안 강화와 취약점 관리를 다룹니다.