
현재 Koin DB는 Container로 운영을 하고 있다. 컨테이너가 멈출 경우는 문제가 되지 않지만 만약 컨테이너가 삭제 되었을 경우 자칫하면 Production의 데이터베이스가 다 날라갈수도 있다.
Mongo, redis는 휘발되어도 큰 문제가 있는데이터는 없지만 mysql같은 경우는 크리티컬한 이슈가 일어날수도 있다.
그중 여러가지 방안이 있겠지만 부하가 가장 적은 시간에 매일 새벽 2시마다 dump를 뜨고 github에 푸시하는 방안을 고려해 보았다.
데이터베이스를 저장할 경로를 만든다.
mkdir /backup
mkdir /backup/database
스크립트 생성
vi /backup/backup_db.sh
스크립트 작성
echo "============ 백업시작 =============="
docker exec mysql-서버버젼-container mysqldump -u koin -p코인비번 koin >/backup/database/mysql_$(date +"%Y%m%d").sql
echo "============= 5일 지난 데이터 삭제 시작 ============="
#5일이 지난건 지워버림
DEL_FILE=`date -d '5 days ago' +%Y%m%d`
rm -rf /backup/database/mysql_${DEL_FILE}.sql
echo "============= 5일 지난 데이터 삭제 완료 ============="
docker에서 dump를 뜨도록 한다.
주의할점:
-p후 띄어쓰기를 하는것이 아닌 붙여써야 한다.(여기서 오랜 시간을 사용....)

dump데이터가 800메가 가량 되기 때문에 5일 전 데이터는 삭제한다.
스크립트 실행권한 부여
chmod a+x ./backup.sh
권한 부여 안하면 돌지 않는다. 주의!
Cron설정
sudo vi /etc/crontab
Cron설정파일 추가
0 4 * * * root /backup/backup.sh 2>/backup/log/backup.log
새벽 4시마다 백업 스크립트를 실시 뒤의 명령어는 log남기는 명령어이다.(테스트시는 0 4 대신 /10 로 10분마다 dump를 뜨게 확인후 log를 보며 오류를 파악 가능하다.)


그러면 위와같이 dump파일이 저장된다.(0328은 뒤의 깃허브 푸시과정중 생략되었다.)
추가로 간혹가다 KoinDB서버처럼 서버의 시간이 서울리전이 아닌경우가 있을수도 있는데, 꼭 수정하자.
위와 마찬가지로 koin_DB프라이빗 레포를 만든뒤 매일 푸시를 하도록 만드려고 하였으나, pish과정 도중 100mb이상의 파일은 glf를 사용하여야 했고, 그는 과금을 포함하기에 추가하지 않았다.
프로덕션에서 운용중인 데이터베이스는 로컬에 마운트를 시켜 놓았다.

이렇게 마운트를 시켜놓으면 컨테이너가 삭제되더라도 데이터베이스는 삭제가 되지 않는다.
출처:
Docker Volume
Docker Volume2
Docker mysql 백업
Docker mysql 백업2
Github push 자동화
Docker mysql 백업3
Github말고 s3에 올리는건 별로였으려나요.
마운트시켜놓으면, ec2에서 컨테이너를 삭제해도 ec2에 db가 남아있는건가? 어떻게 그러지? 아 docker volume 때문이구나 확인.