오늘은 매 시간마다 웹 파일 , 외부,내부에 있는 Mysql/MariaDB 데이터베이스에 덤프 파일을 생성하여 FTP 서버에 자동으로 백업하는 스크립트를 공유하려 합니다.
백업 스크립트가 필요한 이유
왜 매 시간에 저 파일들을 백업하는 스크립트가 필요할까요? 이유는 간단합니다.
클라우드 서버같은경우엔(마이크로소프트의 애저, 구글의 클라우드, 아마존의 AWS 등), 미러링 서버가 상시 대기중이고 24시간 관제 + 유지보수 장비가 아주 잘 되어있기 때문에 사용자(클라이언트)는 데이터 손실에 대해 물리서버 만큼 걱정이 필요하진 않습니다. (그래도 백업은 상시로 해야 합니다!!) 그러나 물리서버는 (회사 자체 운영 서버) 클라이드 서비스 만큼은 대지가 되있지 않은 곳이 대부분 입니다. 제가 아는 지인의 이야기에 따르면, 회사내에서 DB의 한개의 쿼리만 날릴려 했으나, DELETE 문의 조건을 붙이지 않아 모든 컬럼을 다 날려버려(…) 회사 전채가 날리났다는 얘기도 들었습니다. 그런데 문제는 데이터베이스가 백업이 전혀 안되있었다고 들었습니다. 만약 여기서 백업이 되있었다면? 급한 불은 껏을 수 있을 겁니다. (백업 전에 데이터는 손실이지만요.)
서론이 너무 길었네요. 바로 시작합니다.
우선 제가 만든 리눅스 스크립트입니다! 자신의 웹파일 경로, 데이터베이스 경로에 맞게 수정해서 사용하시면 됩니다.
# REDREDGROUP AUTO WEB Backup Service.
# V1.0
# 백업설정 Backup Settings
TODAY=`date +%Y%m%d`
#DELETE_DATE=`date -d "-백업보관기간(단위:일) days" +%Y%m%d`
BACKUP_DIR=/backup
LOG_DIR=/var/log/backup
# 필요한 디렉토리 생성 Create required directories
if [ ! -d ${BACKUP_DIR} ]
then
mkdir ${BACKUP_DIR}
chmod 700 ${BACKUP_DIR}
fi
if [ ! -d ${LOG_DIR} ]
then
mkdir ${LOG_DIR}
fi
# 홈 디렉토리 백업 Back up home directory
TGZ_DIR="/var/www/" #웹파일 경로
TGZ_FILE="webbackup.tar.gz" #압축할 파일 이름
tar cfz ${BACKUP_DIR}/${TODAY}_${TGZ_FILE} ${TGZ_DIR} #압출 이름 설정 및 압축 조건
# DB 계정정보 DB account information
DB_USER="데이터베이스에 접속할 이름"
DB_PW="데이터베이스 접속 패스워드"
DB_HOST="데이터베이스 호스트"
DB_PORT="데이터베이스 포트번호"
# 전체 DB 백업 Full DB backup
SQL_FILE="DBbackup.sql"
mysqldump --all-databases > ${BACKUP_DIR}/${TODAY}_${SQL_FILE}
#mysqldump -u ${DB_USER} -p ${DB_PW} -h ${DB_HOST} --port ${DB_PORT} --all-databases > ${BACKUP_DIR}/${TODAY}_${SQL_FILE}
# Backup server FTP account information
FTP_HOST="FTP호스트명"
FTP_USER="FTP사용자명"
FTP_PW="FTP사용자명의 비밀번호 "
# 원격 백업서버로 백업파일 업로드 (업로드에 실패하면 재시도) Upload backup file to remote backup server (retry if upload fails)
LOG_FILE=${LOG_DIR}/${TODAY}.log
while [ ! -e $LOG_FILE ] || [ `egrep -c "226 Transfer complete" ${LOG_FILE}` -lt 2 ]
do
{
echo user $FTP_USER $FTP_PW
echo bi
echo prompt
echo lcd ${BACKUP_DIR}
echo cd REDREDGROUP_IDC
# echo mdelete ${DELETE_DATE}_${TGZ_FILE} ${DELETE_DATE}_${SQL_FILE}
echo mkdir REDREDGROUP_Backup_${TODAY}
echo cd REDREDGROUP_Backup_${TODAY}
echo mput ${TODAY}_${TGZ_FILE} ${TODAY}_${SQL_FILE}
echo bye
} | ftp -n -v $FTP_HOST > $LOG_FILE
done
# 로컬 백업파일 삭제 Local backup file delete
rm -f ${BACKUP_DIR}/${TODAY}_${TGZ_FILE} ${BACKUP_DIR}/${TODAY}_${SQL_FILE}
제가 만든 코드를 수정해서 사용하셔도 좋고 그대로 계정이름,패스워드 등 서버에 맞게 입력하시고 바로 사용하셔도 됩니다! 이 스크립트를 실행 할 시 파일 백업이 우선 이루워지고 데이터베이스의 덤프를 뜹니다. 그런다음 FTP에 접속하여 현재 날짜의 폴더를 생성 후 그 폴더에 DB 덤프와 웹파일을 복사합니다. 복사가 완료되면 기존에 임시로 백업한 디랙토리의 파일을 지우고 스크립트가 종료됩니다.
그런데 이 스크립트를 매일 수동으로 실행하기엔 너무 귀찬고 효율성이 떨어지기 때문에 저는 스케줄러를 사용하겠습니다. 크론텝에서 등록을 해주면 되는데 제가 이전에 올린 글이 있으니 리눅스 스케줄러에 대해 모르시는 분들은 아래 주소를 통해 스케줄러에 대해 아신다음 스케줄러 탭에 등록하시면 되겠습니다.
크론탭을 이용하여 매주, 매일, 매달 자동으로 실행하게 만들기!
저는 매일 02시 10분에 위의 스크립트가 실행되도록 설정하였습니다. 저랑 같이 스케줄러 시간을 사용하실 분들은 아래의 코드를 복사하여 crontab 스케줄러에 복붙한 후 cron 서비스를 재시작 해주시면 됩니다!
#10 2 * * * sh /etc/backup_scrpit/web_auto_backup.sh > /var/log/script/web_backp/
혹시 자동으로 백업할 것이 아니라 수동으로 백업하고 싶으시다면? crontab에 등록하지 마시고 sudo sh 디랙토리명/web_auto_backup.sh 이렇게 수동으로 스크립트를 실행시키면 수동으로 웹파일과 DB파일이 백업됩니다.
FTP서버에 정상적으로 백업이 된 모습입니다!
댓글에 피드백 , 궁금하신점은 언재나 환영입니다. 감사합니다.