Tech Bastion

리눅스(linux) Docker Mariadb 백업 자동화 crontab 사용하기 본문

OS/linux

리눅스(linux) Docker Mariadb 백업 자동화 crontab 사용하기

ServerPhantom 2024. 8. 9. 17:42

 

올해 초에 어마무시한 녀석에게 해킹 공격을 받은 적이 있다. 가상화패를 채굴하는 녀석이었는데 kswapd0이게 이름인가? 여하튼 마이닝 멀웨어였다. 그놈의 아키텍처를 봤더니 해당 피시를 숙주로 삼아 다른 네트워크를 공격한다길래 정신없이 방어(?)를 했고 이 이야기는 나중에 차분하게 되새겨 봐야겠다. 그 사건으로 인해 자동화시켜 놓은 백업 스케줄이 다 없어져버려서 새로 세팅을 해놔야 하는데 사실 전에 근무하시던 분이 해놓은 거라 내가 새로 하기로 마음먹었다.

 

 

 

우선 DB는 Mariadb를 사용 중이고 도커로 빌드를 해놓은 상태이다.

 

도커 내부로 접속을 해볼까?

docker exec -it mariadb /bin/bash


docker exec -it (컨테이너이름) /bin/bash

 

우선 자동화를 위한 스크립트 파일을 생성했다.

backUp.sh

#! /bin/bash

MYSQLDUMP="/usr/bin/mysqldump"
DB_NAME="db"
DB_USER="root"
DB_PASSWORD="a77afe5fbde2"

# sql backup
$MYSQLDUMP -u$DB_USER -p$DB_PASSWORD $DB_NAME > db_$(date '+%Y%m%d').sql
$MYSQLDUMP -u$DB_USER -p$DB_PASSWORD --all-databases > all_db_$(date '+%Y%m%d').sql

# sql remove
rm -f /db_$(date --date '8 days ago' +%Y%m%d).sql
rm -f /all_db_$(date --date '8 days ago' +%Y%m%d).sql

 

우선 스크립트 파일 맨 위에 "#! /bin/bash"를 적는 이유는 스크립트가 실행될 때 사용할 쉘을 명시적으로 지정하는 것이다. 예를 들어서" #!/usr/bin/env python3" 이라던지 "#!/bin/zsh" 이런식으로 지정할 수가 있고 bash쉘을 사용할 꺼니까 나는 저렇게 작성했다. (깨알 설명)

그러고 나서 도커 밖으로 빠져나와

냅다 리눅스 스케줄 등록

crontab -e

 

 

0 0 * * * docker exec mariadb sh backUp.sh

 

음.. 저 앞에 0 0 * * * 의미는

0 0 * * *
분(0~59 시간(0~23) 일(1~31) 월(1~12) 요일(0~7)

따라서 나는 매월, 매일 , 매 요일마다, 0시 0분에 mariadb 내부의 backUp.sh 파일을 실행시키겠다!라는 의미다.

 

아 귀찮아서 파일은 전부 루트 경로에 있기 때문에 다른 경로에 있을 경우 경로까지 써줘야 한다. 위쪽의 backUp.sh 내부에 도 보면 경로가 없다.

 

그리고 사실 도커내부에서 리눅스로 파일을 옮겨주고 싶은데 일일이 진행하기엔 너무 귀찮은 작업이라 crontab로 작업 하기로 한다.

 

0 0 * * * docker exec mariadb sh backUp.sh
5 0 * * * docker cp mariadb:db_$(date '+%Y%m%d').sql /home/db/db_$(date '+%Y%m%d').sql
5 0 * * * docker cp mariadb:all_db_$(date '+%Y%m%d').sql /home/db/all_db_$(date '+%Y%m%d').sql

 

복습을 해보자면 매월, 매일 , 매 요일마다, 0시 5분에 docker cp 작업을 진행 하겠다 라는 의미이다.

 

이렇게 작성 후에 알고보니

"crontab에서 셀이 명령을 실행할 때 $(date '+%Y%m%d') 부분을 직접 해석하지 않아서 실행이 안될 수 있다."라는 조언을 들었고 급하게 스크립트 파일을 하나 더 생성한다.

 

dockerCP.sh

#!/bin/bash

CURRENT_DATE=$(date '+%Y%m%d')


docker cp mariadb:db_$CURRENT_DATE.sql /home/db/db_$CURRNET_DATE.sql
docker cp mariadb:all_db_$CURRENT_DATE.sql /home/db/all_db_$CURRENT_DATE.sql

 

 

혹시몰라 권한도 부여해 놨다.

chmod +x /home/db/dockerCP.sh

 

그리고 마지막으로 crontab -e 수정 

 

0 0 * * * docker exec mariadb sh db_backup.sh
5 0 * * * /home/db/dockerCP.sh

 

 

백업 자동화 하는데도 배울게 이렇게 많다.