프로그래밍/SQL

MySQL Database 주기적으로 자동 백업하는 법

Lou Park 2022. 2. 14. 00:16

너굴리스트 최근 업데이트에 일부 유저분들 정보를 날려먹고ㅜㅜ DB가 언제나 영원할꺼라 생각했던 나 자신의 어리석음을 반성하며 뒤늦게나마 자동 백업을 도입하기로 했다. 사실 어려운일이 아닌데 1인 개발인데 뭐 날려먹거나 하진 않겠지하는 막연한 믿음때문에 이 사태가 벌어졌다.
앱에서 사용하는 DB를 백업하는 스크립트를 적고, crontab으로 사용자 수가 적은 매일 오전 6시에 돌리려고 한다.

1. Shell script 작성

먼저 db_backup이라는 쉘 스크립트를 작성해야한다.

$ vi db_backup.sh
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/home/lou/db_backups

if [ ! -d $BACKUP_DIR ]; then
  mkdir $BACKUP_DIR
fi

mysqldump -u <USER> -p<PASSWORD> --databases <DB_NAME> > $BACKUP_DIR/"backup_"$DATE.sql

find $BACKUP_DIR -ctime +14 -exec rm -f {} \;

DATE는 2022년 01월 01일이라면 2022-01-01로 변수에 할당된다.

BACKUP_DIR은 백업파일이 저장될 디렉토리다. 그리고 만약에 해당 디렉토리가 없을 경우 디렉토리를 생성하여, 디렉토리가 없어져서 백업이 안되는 상황을 예방할것이다.

mysqldump 구문은 mysql Database를 SQL 파일로 백업하는 부분인데, 나는 특정 DB를 지정해주었지만 모든 DB를 백업하고 싶을 경우 아래와 같이 적어주면 된다.

mysqldump --user root --password  --all-databases > all-databases.sql

마지막 부분은 BACKUP_DIR에 존재하는 파일 중 14일 이상 지난 파일들을 삭제하는 명령어다. 너무 오래지난 파일들은 제거해서 서버 용량이 낭비되지 않도록 막았다.

2. Shell script 권한부여

작성한 스크립트를 실행가능하도록 적절한 권한을 부여한다.

chmod +x db_backup.sh

3. crontab으로 스케쥴링하기

crontab은 5개 단위로 분, 시, 일, 월, 년을 관리할 수 있는데 (종종 6개로 초까지 표현하기도 함) 이것이 익숙하지 않다면 https://crontab.guru 사이트에서 설정을 확인하고 사용하는 것을 추천한다.

 # ┌────────────── second (optional)
 # │ ┌──────────── minute
 # │ │ ┌────────── hour
 # │ │ │ ┌──────── day of month
 # │ │ │ │ ┌────── month
 # │ │ │ │ │ ┌──── day of week
 # │ │ │ │ │ │
 # │ │ │ │ │ │
 # * * * * * *

crontab -e로 crontab 작성모드에 들어간 후 다음과 같이 옵션을 설정해주었다. 주석은 #으로 가능하고, 입력 후 :wq 해서 저장하면 된다.

$ crontab -e

# 매일 오전 6시에 DB 백업
0 6 * * * /home/lou/db_backup.sh

등록한 task는 -l 옵션을 통해 조회할 수 있다.

$ crontab -l

# 매일 오전 6시에 DB 백업
0 6 * * * /root/db_backup.sh

추가적으로, crontab 수행 내용에 대한 로그가 필요할 때가 있다. 그럴 경우에는 crontab 등록시에 다음과 같이 설정해주면 된다.

$ crontab -e

0 6 * * * /home/lou/db_backup.sh >> /home/lou/logs/cron_db_backup.log 2>&1

Extra. 서버시간확인

혹시나! 서버시간이 원하는 시간대로 되어있지 않을 경우 변경하면된다.

$ date
Mon 14 Feb 2022 12:17:05 AM KST

원하는 타임존으로 설정하자.

sudo timedatectl set-timezone Asia/Seoul