Notice
Recent Posts
Recent Comments
Link
반응형
관리 메뉴

쿵야지식떨이

[Infra] MySQL 자동 복구 및 백업 시스템 구축 (2) - 자동 백업 파일 생성 스크립트 작성 본문

Infra

[Infra] MySQL 자동 복구 및 백업 시스템 구축 (2) - 자동 백업 파일 생성 스크립트 작성

김쿵야 2024. 9. 27. 19:13
반응형

자동 백업을 하기 위해서 매시간마다 백업 파일을 생성해 놓을 것이다.

이번 글에서는 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까지 작성을 완료했다.

다음 글에서는 백업 스크립트가 동작을 할 때마다 성공여부를 이메일로 모니터링을 할 수 있게끔 해볼 것이다!

반응형