일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 플러터
- 오블완
- Flutter
- docker
- sqlite
- log
- web
- git
- backup
- MSsql
- db
- windows
- CTF
- dreamhack
- mysql
- scp
- 티스토리챌린지
- 버전관리
- window
- gitea
- Linux
- 수익화
- crontab
- 리다이렉션
- ssh
- 1인개발
- CMD
- git서버
- hacking
- MariaDB
- Today
- Total
Tech Bastion
리눅스(linux) Docker Mariadb 백업 자동화 crontab 사용하기 본문
올해 초에 어마무시한 녀석에게 해킹 공격을 받은 적이 있다. 가상화패를 채굴하는 녀석이었는데 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
백업 자동화 하는데도 배울게 이렇게 많다.
'OS > linux' 카테고리의 다른 글
리눅스에서 윈도우로 파일 전송하기(scp, ssh키 생성 및 적용 방법) (0) | 2024.08.19 |
---|---|
LINUX log(로그)파일 만들기 (0) | 2024.08.13 |