본문 바로가기

Database/mariaDB administrator

mysql 백업 shell script crontab 예제

mysql 백업 shell script crontab 예제

 

안녕하세요.

mysql 백업을 리눅스 bash shell script로 작성하여 crontab에 등록하여 주기적으로 백업이 되고, 오래된 백업 자료를 삭제하는 것 까지 수행하는 script 예문을 포스팅하겠습니다.

 

먼저 포스팅을 보시기 전에 아래 주의사항을 참고하여 주시기 바랍니다.

<주의사항>

아래 내용은 어디까지나 제가 속한 이곳의 환경과 업무 룰에 맞춰서 작업이 이루어진 것입니다.

아래 내용을 그대로 가져다가 적용하셔도 무관하나, 작업을 하시는 곳에 맞춰서 적당히 내용을 변경하여 사용하시길 바랍니다.

백업 작업에 필요한 조건은 아래와 같습니다.

아래 기재된 조건으로 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를 이용해서 자신에게 맞는 방법으로 수정해서 사용하시면 더 좋을 겁니다.

 

감사합니다.

 

 

 

by.sTricky