본문 바로가기
개발팁

mysql 백업 bash 스크립트

by devscb 2023. 10. 24.
반응형

개요

제가 운영하는 서버에서 mysql db를 주기적으로 백업할필요가 있어서 아래와 같이 구상하였습니다.

계정별 DB백업 -> 90MB 분할 zip 파일로 생성 -> git repository로 복사

백업한 파일은 해당 서버가 위험해질 경우에도 사용할 수 있는 저장소가 필요했는데,
비용을 생각하여 github을 무료로 사용할 수 있겠다 싶어 선정하게 되었습니다.
그런데, 단일 파일의 크기가 100MB가 넘으면 push가 되지 않았기에 분할압축을 하였습니다.
또한, git repository도 안전하지 않을 수도 있으므로 암호화 하였습니다.
압축파일을 암호화하려면 linux 계열에서는 zip을 써야한다더군요.
(다시 압축을 풀때 번거롭습니다.)

추가적으로, DB 인스턴스는 하나지만 백업해야할 db대상은 여러개이기에 bash 스크립트를 짜면서 반복문을 사용하였습니다.

필요사항

  1. 압축을 하는 zip 은 제가 운영하는 linux 서버에 기본적으로 설치되어 있지 않아, 설치가 필요합니다.
    아래 명령어로 설치하였습니다. (centOS기준)

  1. git 설정
    1) git repository를 만들고, git token 생성
     ex) git remote add origin [https://devscb:dfasdfsfadfasdff@github.com/devscb/test.git](https://devscb:dfasdfsfadfasdff@github.com/devscb/test.git)
    2) 백업 대상폴더 (backup_db)에서 git init3) 서버에서 git remote add origin git clone https://<계정명>:@<repo명>

백업스크립트

주석에 적어놓았듯이, crontab으로 스케쥴링하도록 등록할 수 있습니다.
예시는 매주 월요일 새벽 4시에 해당 스크립트를 실행하도록 하는 내용입니다.

 

#!/bin/bash
# to apply schedule, 
# 1) $crontab -e"
# 2) 0 4 * * 1 backup_db.sh

DB_USER=(user1 user2)
DB_PW=(pw1 pw2)
DB_NAME=(dbname1 dbname2)


TARGET_DIR='./backup_db'
TODAY=`date '+%Y%m%d%H%M%S'`
LEN=${#DB_USER[@]}

cd $TARGET_DIR
mkdir $TODAY
cd $TODAY
for ((i=0; i<$LEN; i++))
do
	TARGET_FILE_NAME=$TODAY'_'${DB_NAME[$i]}'.sql'
	TARGET_ZIP_NAME=$TODAY'_'${DB_NAME[$i]}'.zip'

	echo "DB dump start : "${DB_NAME[$i]}
	mysqldump -u${DB_USER[$i]}  -p${DB_PW[$i]} --single-transaction ${DB_NAME[$i]} > $TARGET_FILE_NAME
	echo "dump end"

	echo "zip start : "${DB_NAME[$i]}
	zip -s 90m -P ${DB_PW[$i]} -o $TARGET_ZIP_NAME $TARGET_FILE_NAME
	echo "zip end"

	echo "delete dump file : "${DB_NAME[$i]}
	rm -f $TARGET_FILE_NAME
	echo "---------"
done
exit
echo "upload zipped files"
cd ..
git add .
git commit -m "."
git push origin master 

총평

github push시, 단일 파일 크기 제한이 있는 것을 처음 알았네요.
이것을 해결하려고 large file commit 방식도 찾아보았으나, 생각보다 쉽지 않아 분할압축이 좀 더 쉬웠습니다.
또한, bash스크립트를 오랜만에 짜봐서 for문, 배열사용법 등을 찾아보느라 시간이 걸린점도 있고,
mysqldump나 zip 사용법(암호화 압축, 분할압축) 등도 새로 알게 되었습니다.
하나의 통짜 스크립트가 누군가에게, 혹은 미래의 저에게 도움이 되길 바라며 이 글을 남깁니다.

 

 

#mysql, #backup, #mariadb, #script, #bash

 

https://devscb.com/post/185

 

mysql backup bash script

outlineI need to periodically back up mysql db on the server I run, so I came up with the idea below. DB backup for each account -> Create 90MB split zip file -> Copy to git repository Backed u

devscb.com

 

728x90
반응형

댓글