DB

[MySQL] (백업/복구5️⃣) 백업 자동화 스크립트 실무 적용 예제 🤖

인생아 2025. 7. 12. 12:56
반응형

MySQL 데이터를 안전하게 보호하려면 백업을 주기적으로 자동 수행해야 한다.
수동으로 하는 백업은 사람이 까먹을 수도 있고, 장애 상황에서 복구 시점이 오래될 위험이 있다.
이 글에서는 mysqldump를 활용한 백업 스크립트 작성부터 crontab 등록, 백업 압축, 삭제 정책, S3 연동까지 모두 정리한다.

✅ 자동 백업을 위한 기본 구성요소

  • 백업 대상 DB 이름
  • 백업 저장 경로
  • 파일명에 날짜 포함
  • mysqldump 명령
  • 에러 로깅
  • 일정 주기 실행 (crontab)
  • 보관 주기 설정 (삭제 or 외부 업로드)

🧪 가장 기본적인 자동 백업 스크립트

#!/bin/bash

DATE=$(date +%F)
DB_USER="root"
DB_PASS="비밀번호"
DB_NAME="mydb"
BACKUP_DIR="/home/backup/mysql"
LOG_FILE="${BACKUP_DIR}/backup_${DATE}.log"

mkdir -p ${BACKUP_DIR}

mysqldump -u ${DB_USER} -p${DB_PASS} \
  --single-transaction --routines --events \
  ${DB_NAME} > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql 2>> ${LOG_FILE}

스크립트에 실행 권한 부여

chmod +x /home/backup/backup.sh
반응형

📆 crontab에 등록하여 매일 자동 실행

crontab -e

예: 매일 새벽 3시 실행

0 3 * * * /home/backup/backup.sh

Tip: 스크립트 로그가 길어질 경우 logrotate 사용도 고려

📦 백업 파일 압축 추가

백업 용량이 커질 경우 .sql을 .tar.gz로 압축하여 저장 가능

tar -czf ${BACKUP_DIR}/${DB_NAME}_${DATE}.tar.gz ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql
rm ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql

압축 후 .tar.gz 파일만 유지하면 디스크 공간을 절약할 수 있다.

🧹 일정 기간 지난 파일 삭제 (보관 정책 적용)

예: 7일 지난 백업 자동 삭제

find ${BACKUP_DIR} -name "*.tar.gz" -type f -mtime +7 -exec rm {} \;

보안 정책 또는 디스크 용량 제한이 있는 시스템에서 유용하다.

☁️ AWS S3에 자동 업로드 연동 (선택 사항)

AWS CLI 설치 및 설정 후, 아래처럼 백업 파일을 S3로 업로드할 수 있다.

aws s3 cp ${BACKUP_DIR}/${DB_NAME}_${DATE}.tar.gz s3://my-backup-bucket/mysql/

스크립트에 통합하면 외부 백업까지 완성된다.

반응형

📂 전체 자동화 스크립트 통합 버전

#!/bin/bash

DATE=$(date +%F)
DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/home/backup/mysql"
S3_BUCKET="s3://my-backup-bucket/mysql"

mkdir -p ${BACKUP_DIR}

# 백업
mysqldump -u ${DB_USER} -p${DB_PASS} --single-transaction --routines --events \
  ${DB_NAME} > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql

# 압축
tar -czf ${BACKUP_DIR}/${DB_NAME}_${DATE}.tar.gz ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql
rm ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql

# S3 업로드
aws s3 cp ${BACKUP_DIR}/${DB_NAME}_${DATE}.tar.gz ${S3_BUCKET}

# 7일 이전 파일 삭제
find ${BACKUP_DIR} -name "*.tar.gz" -type f -mtime +7 -exec rm {} \;

🧠 실무 운영 포인트

  • 백업 실패 시 관리자 이메일 전송도 고려 (mailx, sendmail)
  • 백업 로그는 /var/log/mysql_backup.log 등에 따로 저장
  • 복수 DB 백업 시 --databases 또는 for 루프 사용
  • 이중화된 NAS or 클라우드 업로드는 강력히 추천

✅ 정리

  • mysqldump는 자동화 스크립트를 통해 매일 안정적으로 백업 가능하다.
  • 날짜, 로그, 압축, 삭제 등 실무 백업 관리의 모든 요소를 스크립트에 포함해야 한다.
  • crontab을 활용하면 무중단 백업 시스템을 만들 수 있다.
  • AWS S3 업로드를 포함하면 보관 안정성이 크게 올라간다.
  • 반드시 정기적인 복원 테스트를 병행해야 실전 대응력이 생긴다.

🔗 공식 문서 참고
MySQL 8.0 Reference Manual - mysqldump — A Database Backup Program

 

반응형