mysql 백업 shell script crontab 예제
mysql 백업 shell script crontab 예제
백업 작업에 필요한 조건은 아래와 같습니다.
아래 기재된 조건으로 bash shell script 작업 및 crontab 작업을 적용하였습니다.
1. mysql 내 백업할 database 목록이 들어있는 txt 파일을 작성한다.
2. 백업 대상 database 목록 txt 파일을 읽어서 백업을 수행한다.
3. 백업 시작과 종료 시 로그를 남긴다.
4. 백업 파일과 로그파일을 백업하는 날짜명으로 생성한 폴더에 저장한다.
5. 매주 수요일, 일요일 새벽에 백업을 실행한다.
6. 한 주 전에 생성한 백업 파일은 삭제한다.
위와 같은 조건으로 bash shell script를 작성합니다.
1. 필요 폴더 생성
우선 서버 내 적당한 Disk 공간을 가진 곳에 mysql_backup이라는 폴더를 생성합니다.
그리고 그 아래 database_backup_files과 shell_script 폴더를 생성합니다.
# mkdir mysql_backup
# cd mysql_backup
# mkdir database_backup_files
# mkdir shell_script
그리고 shell_script 폴더로 이동을 합니다.
2. 백업 대상 database 목록을 저장한 파일 생성하기
# vi db_backup_databases.txt
# test_db1
# test_db2
# test_db3
위와 같이 vi db_backup_databases.txt라고 입력하여 txt 파일을 하나 만들고 그 안에 위 예제처럼 백업을 하고 싶은 대상 database명을 입력하시면 됩니다.
위와 같이 입력하면 test_db1, test_db2, test_db3 데이터베이스가 백업이 될 것입니다.
3. bash shell script 작성 하기
역시 마찬가지로 shell_script 폴더에서 아래와 같이 bash shell script 파일을 vi로 생성합니다.
# vi db_backup.sh
그리고 아래와 같이 내용을 추가합니다.
#!/bin/bash
#-------------------------------------------
#
# 이 구역 아래에 쓰는것 처럼 shell script의 라벨을
# 작성 해주면 좋습니다.
# Backup Shell Script
#
# Developer : 이름 (DBA)
#
# date of initial development 2020-07-02
# Final modification date 2020-07-02
#-------------------------------------------
#===========================================
# 2020-07-02
# Backup Schema List
#-------------------------------------------
#
# /data/mysql_backup/shell_script/ulex15_db_backup_databases.txt
#
#===========================================
# profile
source /home/ulex/.profile
# Variable Declaration
BAK_FILE_NM=_db_backup_`date +"%Y%m%d"`.sql
BAK_LOG_FILE_NM=0db_backup_`date +"%Y%m%d"`.log
BAK_FILE_SAVE_PATH=/data/mysql_backup/database_backup_files
BAK_FILE_DIRECTORY=`date +"%Y%m%d"`
WEEK_AGO=`date -d '1 week ago' +"%Y%m%d"`
MYSQL_HOST='localhost'
MYSQL_USER='db계정명'
MYSQL_PASSWORD='db암호명'
# 암호를 노출하기 싫다면 암호화된 텍스트로 저장하여 불러오는 방법도 있습니다.
# 또는 DB 접속 자체를 암호를 입력하지 않도록 설정을 하는 방법도 있습니다.
# create backup directory
mkdir ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}
# backup start
for backup_database in $(cat /data/mysql_backup/shell_script/ulex15_db_backup_databases.txt);
do
echo `date +"%Y-%m-%d %H:%M:%S"`" <<<"$backup_database" backup shell script start!>>>" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
mysqldump --single-transaction --databases $backup_database -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} > ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/$backup_database${BAK_FILE_NM} 2>&1 &&
echo `date +"%Y-%m-%d %H:%M:%S"`" <<<"$backup_database" backup shell script end!>>>" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
echo "" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
done
# 1 week ago backup delete
rm -rf $BAK_FILE_SAVE_PATH/$WEEK_AGO
4. bash shell script 구문 설명
위 내용을 보시면 아시겠지만 다양한 변수를 선언해줍니다.
변수 내용을 간단히 설명드리겠습니다.
변수명 | 변수 값 | 변수 의미 |
BAK_FILE_NM | db_backup_`date +"%Y%m%d"`.sql | 백업 파일명 입니다. 중간에 있는 %Y%m%d는 실행되는 시간의 년월일을 받아오는 것 입니다. |
BAK_LOG_FILE_NM | db_backup_`date +"%Y%m%d"`.log | 백업 로그파일명 입니다. |
BAK_FILE_SAVE_PATH | /data/mysql_backup/database_backup_files | 백업파일과 로그파일이 날짜명 폴더에 저장이 되는데, 이 날짜명 폴더가 생성될 경로 입니다. |
BAK_FILE_DIRECTORY | `date +"%Y%m%d"` | 년월일로 된 날짜명입니다. 이를 백업파일과 로그파일이 저장 될 폴더 명으로 쓰게 됩니다. |
WEEK_AGO | `date -d '1 week ago' +"%Y%m%d"` | 1주전 백업파일을 지우는데, 1주일전 년월일을 저장하는 변수 입니다. |
MYSQL_HOST | 'localhost' | mysql 접속 경로 입니다. |
MYSQL_USER | DB 계정명 | |
MYSQL_PASSWORD | DB Password 입니다. |
위와 같이 shell script내에서 쓸 변수를 미리 선언합니다.
그리고 DB 암호 같은 경우는 암호를 노출하기 싫다면 암호화된 텍스트로 저장하여 불러오는 방법도 있습니다. 또는 DB 접속 자체를 암호를 입력하지 않도록 설정을 하는 방법도 있습니다.
# create backup directory
mkdir ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}
위 구문은 저장 경로에서 shell script가 실행되는 날짜로 된 폴더를 생성합니다.
# backup start
for backup_database in $(cat /data/mysql_backup/shell_script/ulex15_db_backup_databases.txt);
do
echo `date +"%Y-%m-%d %H:%M:%S"`" <<<"$backup_database" backup shell script start!>>>" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
mysqldump --single-transaction --databases $backup_database -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} > ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/$backup_database${BAK_FILE_NM} 2>&1 &&
echo `date +"%Y-%m-%d %H:%M:%S"`" <<<"$backup_database" backup shell script end!>>>" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
echo "" >> ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/${BAK_LOG_FILE_NM}
done
그리고 for loop이 적용된 부분인데요.
잘 보시면 아시겠지만 /data/mysql_backup/shell_script/ulex15_db_backup_databases.txt 에 저장된 백업 대상 스키마 하나를 읽어와 backup_database라는 변수에 저장을 합니다.
그리고, log 파일에 시작하는 일시를 기록하고, mysqldump 명령어를 이용해서 백업을 시작합니다.
백업이 다 되고 나면 종료시간을 다시 log 파일에 기록합니다.
이렇게 백업 대상 목록(/data/mysql_backup/shell_script/ulex15_db_backup_databases.txt)에 저장된 모든 스키마를 백업하게 됩니다.
# 1 week ago backup delete
rm -rf $BAK_FILE_SAVE_PATH/$WEEK_AGO
마지막으로, 1주일 전 백업되었던 폴더를 삭제합니다.
저 같은 경우는 위 스크립트를 매주 수요일, 일요일 새벽 4시에 실행합니다.
그러므로 항상 두벌의 백업본을 가지고 있게 되는 샘입니다.
5. crontab에 등록하기
# mysql db backup shell
0 4 * * 0,3 /data/mysql_backup/shell_script/ulex15_db_backup.sh &
위와 같이 crontab에 등록을 해줍니다.
mysql 백업에는 다양한 방법이 있습니다.
위 bash shell script를 이용해서 자신에게 맞는 방법으로 수정해서 사용하시면 더 좋을 겁니다.
mysql, 백업, shell, script crontab, 예제