Ubuntu에서 MySQL 자동 백업 설정: crontab과 mysqldump를 활용한 데이터 보호 방안

Ubuntu 환경에서 MySQL 자동 백업 구축 가이드

Ubuntu 운영체제에서 crontab과 mysqldump를 조합하여 MySQL 데이터베이스의 자동 백업 시스템을 구축하는 방법을 안내합니다. 이 방법은 데이터 안전성을 보장하며, Ubuntu 22.04 LTS와 MySQL 8.0 환경에서 검증된 실용적인 접근법입니다.

  1. 사전 준비사항

시작하기 전에 다음 요건이 충족되는지 확인하세요:

  • MySQL이 설치되고 실행 중인 상태인지 확인(mysql --version 명령어 사용)
  • 현재 사용자가 MySQL 접근 권한을 가지고 있는지(권장: root 또는 백업 권한이 있는 사용자)
  • 백업 저장 디렉토리 생성:
mkdir -p /var/backups/mysql  # 백업용 디렉토리 생성
chmod 700 /var/backups/mysql  # 접근 권한 설정
  • mysqldump 기능 테스트(실제 데이터베이스 이름으로 your_database_name 대체):
mysqldump -u root -p your_database_name > /var/backups/mysql/test.sql

비번 입력 후 /var/backups/mysql/test.sql 파일 생성 여부 확인

  1. 백업 스크립트 생성

날짜 스탬프를 추가하여 이전 백업 파일을 덮어쓰지 않는 셸 스크립트를 작성합니다.

  1. 스크립트 파일 생성(/usr/local/bin/mysql_backup.sh):
#!/bin/bash
# 변수 정의
BACKUP_DIR="/var/backups/mysql"
DB_NAME="your_database_name"  # 실제 데이터베이스 이름으로 변경
USER="root"                   # MySQL 사용자명
PASSWORD="your_password"      # MySQL 비밀번호(보안 주의)
DATE=$(date +\%Y\%m\%d)       # 현재 날짜 형식(예: 20231001)

# mysqldump를 사용해 데이터베이스 내보내기
mysqldump -u $USER -p$PASSWORD $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql

# 선택 사항: 백업 파일 압축으로 공간 절약
gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql

# 로그 기록
echo "백업 완료 시간: $(date)" >> $BACKUP_DIR/backup.log
  1. 스크립트 권한 설정:
chmod +x /usr/local/bin/mysql_backup.sh  # 실행 권한 부여
  1. 주의사항:
  • your_database_name, your_password를 실제 값으로 변경
  • 비밀번호를 평문으로 저장하는 것은 보안에 취약하므로 MySQL 설정 파일이나 환경 변수 사용 권장(4단계 참조)
  • 스크립트 테스트: ./mysql_backup.sh를 직접 실행하여 /var/backups/mysql.sql.gz 파일과 로그가 생성되는지 확인
  1. crontab을 이용한 예약 작업 설정

crontab은 지정된 시간에 스크립트를 자동으로 실행할 수 있게 해줍니다. cron 시간 형식은 분 시 일 월 요일입니다(예: 0 2 * * *는 매일 새벽 2시를 의미).

  1. crontab 편집:
crontab -e  # 현재 사용자의 cron 설정 파일 열기
  1. 예약 작업 추가(매일 새벽 2시에 백업 스크립트 실행):
# 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /usr/local/bin/mysql_backup.sh
  • 시간 매개변수 설명:
  • 0 2 * * *: 분=0, 시간=2, 나머지는 *(매일)을 의미
  • 시간 조정 예: 매월 월요일 새벽 3시는 0 3 * * 1로 변경
  1. 저장 및 나가기(nano 편집기에서 Ctrl+X, Y 눌러 확인)
  2. 주의사항:
  • cron 서비스 상태 확인: systemctl status cron(서비스가 실행 중인지 확인)
  • cron 로그 확인: grep CRON /var/log/syslog(작업이 트리거되었는지 확인)
  • 스크립트에 환경 변수(예: MySQL 비밀번호)가 필요한 경우 스크립트 내에 설정하거나 /etc/environment 파일 사용

4> 테스트 및 검증

  1. 수동 테스트:
  • crontab -l 명령으로 작업이 추가되었는지 확인
  • 스크립트 수동 실행: /usr/local/bin/mysql_backup.sh
  • 백업 파일 확인: ls -l /var/backups/mysql에서 your_database_name_20231001.sql.gz와 유사한 파일 존재 여부 확인
  1. 자동 실행 테스트:
  • 예약 작업 실행 대기(또는 테스트를 위해 cron 시간을 * * * * *(매분)로 일시 변경)
  • 로그 확인: tail -f /var/backups/mysql/backup.log 또는 grep CRON /var/log/syslog
  1. 복원 테스트(선택 사항):
  • 백업 파일 압축 해제: gzip -d your_database_name_20231001.sql.gz
  • MySQL로 데이터 가져오기: mysql -u root -p your_database_name < your_database_name_20231001.sql
  • 데이터 무결성 확인

추가 고려사항

  • 보안 강화 방안:

  • 스크립트에 비밀번호를 평문으로 저장하지 않기: MySQL 설정 파일(~/.my.cnf[client] user=root password=your_password 설정) 사용 및 파일 권한 chmod 600 ~/.my.cnf로 제한

  • 백업 파일 암호화: openssl 또는 gpg를 사용해 민감 데이터 암호화

  • 저장 공간 관리:

  • 이전 백업 파일 정기적 삭제(스크립트에 추가: find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete로 30일 이전 파일 삭제)

  • 원격 저장소(AWS S3 또는 다른 서버)로 백업

  • 오류 처리:

  • 스크립트에 오류 검증 추가:

if [ $? -ne 0 ]; then
  echo "백업 실패 시간: $(date)" >> $BACKUP_DIR/error.log
  exit 1
fi
  • 로그 모니터링: cron을 통해 이메일 알림 설정

  • 성능 고려사항:

  • 대형 데이터베이스는 백업에 시간이 오래 걸릴 수 있으니 사용량이 적은 시간대에 실행

  • --single-transaction 옵션 사용으로 테이블 잠금 방지(InnoDB 테이블에 적용)

태그: MySQL crontab mysqldump ubuntu 데이터베이스 백업

7월 12일 20:31에 게시됨