[Linux] crontab으로 mysql dump를 뜨자
안녕하세요 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