Ubuntu 환경에서 MySQL 자동 백업 구축 가이드
Ubuntu 운영체제에서 crontab과 mysqldump를 조합하여 MySQL 데이터베이스의 자동 백업 시스템을 구축하는 방법을 안내합니다. 이 방법은 데이터 안전성을 보장하며, Ubuntu 22.04 LTS와 MySQL 8.0 환경에서 검증된 실용적인 접근법입니다.
- 사전 준비사항
시작하기 전에 다음 요건이 충족되는지 확인하세요:
- 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 파일 생성 여부 확인
- 백업 스크립트 생성
날짜 스탬프를 추가하여 이전 백업 파일을 덮어쓰지 않는 셸 스크립트를 작성합니다.
- 스크립트 파일 생성(
/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
- 스크립트 권한 설정:
chmod +x /usr/local/bin/mysql_backup.sh # 실행 권한 부여
- 주의사항:
your_database_name,your_password를 실제 값으로 변경- 비밀번호를 평문으로 저장하는 것은 보안에 취약하므로 MySQL 설정 파일이나 환경 변수 사용 권장(4단계 참조)
- 스크립트 테스트:
./mysql_backup.sh를 직접 실행하여/var/backups/mysql에.sql.gz파일과 로그가 생성되는지 확인
- crontab을 이용한 예약 작업 설정
crontab은 지정된 시간에 스크립트를 자동으로 실행할 수 있게 해줍니다. cron 시간 형식은 분 시 일 월 요일입니다(예: 0 2 * * *는 매일 새벽 2시를 의미).
- crontab 편집:
crontab -e # 현재 사용자의 cron 설정 파일 열기
- 예약 작업 추가(매일 새벽 2시에 백업 스크립트 실행):
# 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /usr/local/bin/mysql_backup.sh
- 시간 매개변수 설명:
0 2 * * *: 분=0, 시간=2, 나머지는 *(매일)을 의미- 시간 조정 예: 매월 월요일 새벽 3시는
0 3 * * 1로 변경
- 저장 및 나가기(nano 편집기에서 Ctrl+X, Y 눌러 확인)
- 주의사항:
- cron 서비스 상태 확인:
systemctl status cron(서비스가 실행 중인지 확인) - cron 로그 확인:
grep CRON /var/log/syslog(작업이 트리거되었는지 확인) - 스크립트에 환경 변수(예: MySQL 비밀번호)가 필요한 경우 스크립트 내에 설정하거나
/etc/environment파일 사용
4> 테스트 및 검증
- 수동 테스트:
crontab -l명령으로 작업이 추가되었는지 확인- 스크립트 수동 실행:
/usr/local/bin/mysql_backup.sh - 백업 파일 확인:
ls -l /var/backups/mysql에서your_database_name_20231001.sql.gz와 유사한 파일 존재 여부 확인
- 자동 실행 테스트:
- 예약 작업 실행 대기(또는 테스트를 위해 cron 시간을
* * * * *(매분)로 일시 변경) - 로그 확인:
tail -f /var/backups/mysql/backup.log또는grep CRON /var/log/syslog
- 복원 테스트(선택 사항):
- 백업 파일 압축 해제:
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 테이블에 적용)