Exp/Linux

[Linux] crontab으로 mysql dump를 뜨자

kilog 2024. 5. 7. 01:07
728x90

안녕하세요 ki입니다.

이번 Exp는 crontab으로 mysql dump입니다.

이전 글에서는 crontab 기본적인 지식을 공유했었습니다.

이번 글에서는 제가 업무에서 담당했던 백업 스크립트를 작성 후 crontab 설정에서

백업스크립트 작성 방법을 공유하려 합니다.

2024.05.06 - [Exp/Linux] - [Linux] crontab을 알아보자

 

[Linux] crontab을 알아보자

안녕하세요 ki입니다.이번 Exp는 리눅스 크론탭(crontab)입니다.솔루션 프로젝트에 참여했을 시기에 크론탭으로 일정시간마다 백업되는 부분을 개발한 적이 있습니다.그럴 때 이용한 게 crontab이었

kkkkt.tistory.com

 

 

 

mysqldump

# 전체 데이터베이스 백업
mysqldump -h [호스트] -u [사용자 이름] -p[암호] --all-databases > [백업경로]

# 특정 데이터베이스 백업
mysqldump -h [호스트] -u [사용자 이름] -p[암호] [데이터베이스 이름] > [백업 경로]

# 테이블 단위로 백업
mysqldump -h [호스트] -u [사용자 이름] -p[암호] [데이터베이스 이름] [테이블 이름] > [백업 경로]

# 백업 파일 압축
mysqldump -h [호스트] -u [사용자 이름] -p[암호] [데이터베이스 이름] | gzip > [압축백업 경로]

 

옵션들

# MySQL 호스트를 지정합니다.
-h 또는 --host

# MySQL 사용자 이름을 지정합니다.
-u 또는 --user

# MySQL 암호를 입력합니다.
-p 또는 --password 

# 모든 데이터베이스를 백업합니다.
--all-databases

# 특정 데이터베이스를 백업합니다.
--databases

# 특정 테이블을 백업합니다.
--tables

# 일관된 스냅샷을 사용하여 데이터베이스를 백업합니다.
--single-transaction

# 백업 파일에 DROP DATABASE 문을 포함시킵니다.
--add-drop-database

# 백업 파일에 DROP TABLE 문을 포함시킵니다.
--add-drop-table

# 백업 결과를 파일로 저장합니다.
--result-file

# 백업 파일을 압축합니다.
--compress 

# 상세한 출력을 표시합니다.
--verbose

# 도움말을 표시합니다.
--help

 

 

위 명령어들을 이용하여 dump를 진행할 수 있습니다.

저는 예제를 보고 백업 스크립트를 개발했었는데 제가 이해하기 쉬웠던 예제는 아래와 같습니다.

 

vi db_backup_databases.txt

test_db1
test_db2
test_db3


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

 

 

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}

 

예제에 상단에 해당하는 부분은 변수에 설정할 파일명/db정보를 설정하는 부분입니다.

 

# 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문입니다.

for i in {1..5}
do
    echo "Number: $i"
done

# or

count=0
while [ $count -lt 5 ]
do
    echo "Count: $count"
    ((count++))
done

 

for i in {1.. 5}를 5까지 반복하고 do ~ done안에 구문을 반복합니다.

예제처럼/data/mysql_backup/shell_script/ulex15_db_backup_databases.txt를 cat명령어로  내용을 출력하여 변수에 넣고

do ~ done 안에 구문을 반복한다고 이해할 수 있습니다.

 

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}

# `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 &&

# 실질적으로 dump를 진행하는 부분입니다. 옵션들과 같이 작성하여 설정하고
# ${BAK_FILE_SAVE_PATH}/${BAK_FILE_DIRECTORY}/$backup_database${BAK_FILE_NM} 
# 위에 명령어로 변수에 넣은 정보들로 경로에 파일을 백업합니다.

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}


# 상단에 로그에 입력하는 것과 동일합니다.

 

 

저는 예제를 해석해서 제가 필요한 부분을 작성하여 쉘스크립트를 작성하고 이용했습니다.

많은 부분을 예제에서 이용해서 좋은 정보와 경험을 하게 되어 의미 있는 프로젝트였습니다.

 

예제츨저

https://stricky.tistory.com/304

 

mysql 백업 shell script crontab 예제

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

stricky.tistory.com