Linux 서버 관리 완전 정복 9편: 백업과 복구 전략
Linux Server Administration Complete Guide Part 9
Linux 서버 관리 완전 정복 시리즈
8편: 로그 관리 | 9편: 백업과 복구 (현재) | 10편: 보안 강화
들어가며: 백업 없이는 데이터도 없다
데이터 손실은 언제든 발생할 수 있습니다. 하드웨어 장애, 인적 오류, 보안 침해, 자연재해 등 다양한 원인에 대비하는 백업 전략은 서버 운영의 필수입니다.
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. 정기 검토 및 업데이트
마무리
백업은 서버 운영의 생명선입니다. 정기적인 백업, 복구 테스트, 그리고 재해 복구 계획을 통해 어떤 상황에서도 데이터를 보호할 수 있습니다. 마지막 편에서는 보안 강화와 취약점 관리를 다룹니다.