Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- JPA
- programmers
- 비동기
- 알고리즘
- webflux
- 스왑메모리
- swapmemory
- 프로그래머스
- Algorithm
- 백업
- Java
- R2DBC
- AWS
- Infra
- SUbmodule
- github
- GoogleCloudStorage
- 백준
- ci/cd
- TaskExecutor
- GCS
- mono
- actions
- EC2
- CompletableFuture
- 백업스크립트
- @async
- 파일업로드
- gitActions
- mysql
Archives
- Today
- Total
쿵야지식떨이
[Infra] MySQL 자동 복구 및 백업 시스템 구축 (2) - 자동 백업 파일 생성 스크립트 작성 본문
반응형
자동 백업을 하기 위해서 매시간마다 백업 파일을 생성해 놓을 것이다.
이번 글에서는 mysql 백업 파일 생성 스크립트와 crontab 작성을 해보려 한다.
🧐 mysql 백업 파일 생성 스크립트 작성
❗저는 모든 과정을 'sudo su -'로 root 권한을 얻은 상태에서 진행하였습니다.
1. 백업 파일을 저장할 원하는 디렉터리 생성
mkdir -p /var/backups/mysql
2. 디렉토리 권한 설정
chmod 700 /var/backups/mysql
- 여기서 700은 권한을 의미한다.
- 디렉터리의 권한은 3자리의 숫자로 표현되며 각 자리는 소유자인 user, group, 다른 사용자(other)에 대한 권한을 나타낸다.
- 각 숫자는 읽기, 쓰기, 실행 권한을 의미하며 각각의 권한들은 아래의 숫자와 같이 조합된다.
- 읽기 권한 : 4
- 쓰기 권한 : 2
- 실행 권한 : 1
- 위 숫자들을 더해서 권한을 표현한다.
- 내가 지정한 700 권한은 소유자인 user는 읽기, 쓰기, 실행 권한 모두 허용하고 group과 other에게는 아무 권한도 주지 않는다는 의미이다!
3. 스크립트에서 사용할 값 환경 변수 처리
- 스크립트에 중요한 값들을 바로 넣기에는 보안 문제가 있기 때문에 먼저 환경 변수로 지정해 준 후 넣어줄 것이다.
- 유저 명과 비밀번호와 같은 것들을 저장하기 때문에 설정 파일에 저장할 것이다!
- 나는 해당 db의 유저와 비밀번호, root의 비밀번호까지 환경변수 처리를 해줬다.
echo "export VARIABLE_NAME='환경 변수 값'" >> ~/.bashrc
source ~/.bashrc
- Bash를 사용하기 때문에 .bashrc에 추가해 줬다.
- 위처럼 하면 영구적으로 저장되기 때문에 세션을 종료 후에 다시 접속해도 값이 남아있다.
echo $VARIABLE_NAME
- 잘 적용되었는지 확인할 때는 위 처럼 입력하면 된다.
4. 백업 스크립트 생성
nano /usr/local/bin/backup.sh
- 위 명령어를 입력하면 스크립트 작성 창이 나온다.
5. 백업 스크립트 내용 추가
#!/bin/bash
# MySQL 데이터베이스 정보
MYSQL_USER="${MYSQL_USER}"
MYSQL_PASSWORD="${MYSQL_PASSWORD}"
MYSQL_DATABASE="${MYSQL_DATABASE}"
# 백업 디렉토리 설정
BACKUP_DIR="/var/backups/mysql"
# 로그 파일 설정
LOG_FILE="/var/log/mysql_backup.log"
# 날짜 형식으로 백업 파일 이름 설정
BACKUP_FILE="${BACKUP_DIR}/backup-$(date +%F-%H-%M-%S).sql"
# 디렉토리가 존재하지 않으면 생성
mkdir -p "${BACKUP_DIR}"
# Docker 컨테이너 내에서 데이터베이스 백업
docker exec mysql-db /usr/bin/mysqldump -u "${MYSQL_USER}" -p"${MYSQL_PASSWORD}" \
"${MYSQL_DATABASE}" > "${BACKUP_FILE}"
# 백업 성공 여부 확인 및 파일 크기 확인
if [ $? -eq 0 ] && [ -s "${BACKUP_FILE}" ]; then
echo "$(date): Backup successful: ${BACKUP_FILE}" >> "${LOG_FILE}"
else
echo "$(date): Backup failed! See log for details." >> "${LOG_FILE}"
fi
- 위 스크립트는 백업 파일을 생성하는 스크립트다. 각각의 설명은 아래와 같다!
- MySQL 데이터베이스 정보
- 백업하려는 MySQL에 접속하기 위한 사용자 정보와 데이터 베이스 이름을 변수 값으로 설정한다.
- 위에서 .bashrc에 저장한 값들의 환경 변수 명을 적어주면 된다.
- 백업 디렉토리 설정
- 백업 파일을 저장할 디렉터리 경로를 지정한다.
- 맨 처음 만들었던 디렉터리 경로를 입력하면 된다.
- 날짜 형식으로 백업 파일 이름 설정
- 백업 파일 이름을 날짜와 시간 형식으로 지정한다.
- 파일 이름 중복 방지와 생성 시점을 쉽게 찾기 위해 설정했는데 원하는 방식이 있다면 변경해도 무관하다.
- 디렉터리가 존재하지 않으면 생성
- 백업 디렉토리가 존재하지 않는 경우, mkdir -p 명령어를 통해 해당 디렉터리를 자동으로 생성한다.
- 혹시 모를 오류 상황에 대비해 넣어두었다.
- 이미 디렉토리가 존재한다면 아무 오류 없이 넘어간다!
- Docker 컨테이너 내에서 데이터베이스 백업
- Docker 명령어를 통해 MySQL 컨테이너 내부에서 "mysqldump" 명령어를 실행하여 데이터베이스 백업을 생성한다.
- 백업 성공 여부 확인 및 파일 크기 확인
- 백업 작업의 성공 여부를 확인한다.
- $? 는 마지막 명령어의 종료 상태를 나타내며 0이면 명령이 성공한 것이다.
- 백업이 성공하면 성공 메시지와 함께 백업 파일 경로를 출력한다.
- 백업 파일이 0바이트로 생성되는 경우도 실패로 간주한다.
- 실패 시 오류 메시지를 출력하며 로그 파일에 백업 성공/실패 내역과 발생한 오류를 기록한다.
- 스크립트 작성이 완료되었다면 ctrl + o를 눌러 저장하고 ctrl + x로 스크립트 내부에서 빠져나간다.
- ctrl + o를 누르면 현재 스크립트를 작성한 파일 명이 맞는지 확인 절차가 나오는데 파일 명을 확인 후 enter를 누르면 된다.
6. 스크립트 실행 권한 부여
chmod +x /usr/local/bin/backup.sh
- 스크립트에 실행 권한이 없는 상태로 실행하면 "Permission denide" 오류가 발생한다.
- 위 명령어에서 chmod(Chang Mode)는 파일이나 디렉터리의 권한을 변경하는 명령어이다.
- +x는 파일에 실행 권한을 부여하며 해당 스크립트를 실행 가능한 프로그램처럼 실행할 수 있다.
7. 적용한 스크립트 내용 확인
cat /usr/local/bin/backup.sh
- 스크립트 파일의 내용을 출력하는 명령어이다.
- 스크립트의 내용이 잘 적용되었는지 확인해 볼 수 있다.
8. crontab 추가
crontab -e
- 위 스크립트 작업을 특정 시간마다 자동으로 작업을 수행하도록 하기 위해 crontab을 활용하여 크론 작업을 설정해 줄 것이다.
9. crontab 최초 추가 시
root:~# crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
- crontab을 처음 추가 시에는 위처럼 나온다.
- 보통은 nano가 사용하기 간편하기 때문에 1을 눌러서 /bin/nano를 선택한다.
10. crontab 작업 추가
0 9 * * * /usr/local/bin/backup.sh
0 18 * * * /usr/local/bin/backup.sh
0 22 * * * /usr/local/bin/backup.sh
0 2 * * * /usr/local/bin/backup.sh
- 1을 선택하면 바로 crontab 작업을 추가할 수 있게 나올 것이다.
- 본인이 원하는 작업 스케줄을 입력하면 된다.
* * * * * 명령어
| | | | |
| | | | ----- 요일 (0-7, 0과 7은 일요일)
| | | ------- 월 (1-12)
| | --------- 일 (1-31)
| ----------- 시간 (0-23)
------------- 분 (0-59)
- 각각의 자리가 의미하는 바는 위와 같으며 내가 추가한 건 아침 9시, 저녁 6시, 밤 10시, 새벽 2시에 백업 스크립트 실행이다.
11. crontab 설정 확인
crontab -l
- 위 명령어를 입력하여 crontab이 잘 적용되었는지 확인해 볼 수 있다.
12. 백업 스크립트 수동 실행
/usr/local/bin/backup.sh
- 백업 스크립트를 수동으로 실행해 보는 명령어이다.
13. 백업 파일 존재 확인
ls -lh /var/backups/mysql
- 지금까지 생성된 백업 파일의 total 개수와 파일들을 확인할 수 있다.
- 위 과정을 모두 성공적으로 마무리했다면 1개의 파일이 생성되어 있을 것이다 :)
이번 글에서는 백업 스크립트 작성을 하고 crontab까지 작성을 완료했다.
다음 글에서는 백업 스크립트가 동작을 할 때마다 성공여부를 이메일로 모니터링을 할 수 있게끔 해볼 것이다!
반응형
'Infra' 카테고리의 다른 글
[Infra] MySQL 자동 복구 및 백업 시스템 구축 (1) - 상황 및 원인 분석 (0) | 2024.09.12 |
---|---|
Swap Memory (스왑 메모리) 설정 (0) | 2024.08.08 |
[Infra] GCS 적용 (3) - GCS 프로젝트에 적용 (0) | 2024.04.22 |
[Infra] GCS 적용 (2) - GCS 기본 생성 (0) | 2024.04.09 |
[Infra] GCS 적용 (1) - GCS(Google Cloud Storage)란? (0) | 2024.04.06 |