mysql 백업 shell script crontab 예제
안녕하세요.
mysql 백업을 리눅스 bash shell script로 작성하여 crontab에 등록하여 주기적으로 백업이 되고, 오래된 백업 자료를 삭제하는 것 까지 수행하는 script 예문을 포스팅하겠습니다.
먼저 포스팅을 보시기 전에 아래 주의사항을 참고하여 주시기 바랍니다.
<주의사항> 아래 내용은 어디까지나 제가 속한 이곳의 환경과 업무 룰에 맞춰서 작업이 이루어진 것입니다. 아래 내용을 그대로 가져다가 적용하셔도 무관하나, 작업을 하시는 곳에 맞춰서 적당히 내용을 변경하여 사용하시길 바랍니다. |
백업 작업에 필요한 조건은 아래와 같습니다.
아래 기재된 조건으로 bash shell script 작업 및 crontab 작업을 적용하였습니다.
1. mysql 내 백업할 database 목록이 들어있는 txt 파일을 작성한다. |
위와 같은 조건으로 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를 이용해서 자신에게 맞는 방법으로 수정해서 사용하시면 더 좋을 겁니다.
감사합니다.
by.sTricky
'Database > mariaDB administrator' 카테고리의 다른 글
ORACLE to Mysql DBMS로의 Migration 프로세스 (0) | 2020.07.22 |
---|---|
Mysql objects 개념 정리 for 개발자 (2) | 2020.07.14 |
mysql general_log shell script로 백업 관리 하기 (4) | 2020.06.25 |
mysql ERROR 1118 row size too large 오류 해결 방안 (0) | 2020.06.23 |
slow_query_log general_log 테이블 설정 방법 (0) | 2020.06.03 |