[MySQL] 데이터 자동 백업

코린이·2025년 7월 4일

포트폴리오

목록 보기
3/7

📢 개요

데이터를 주기적으로 백업하는 일은 DBA에게 있어 중요한 업무 루틴 중 하나라고 생각한다.
(언제, 어떤 데이터의 복구 작업이 필요할지 알 수 없으므로 주기적으로 데이터를 백업할 필요가 있다)

이처럼 주기적인 데이터 백업을 수행할 때마다 DB 서버에 접속하여 백업 명령어를 일일이 수기로 작성하여 데이터를 백업해야 한다.

하지만 위 방법은 주기적으로 발생하는 반복 작업이기 때문에, 백업 스크립트를 작성한 뒤 스케줄러로 등록하는 방법이 가장 효율적인 방법이라 생각한다.


📋 계획

아래 두 과정을 거치면 자동 백업을 간단하게 적용/실행할 수 있다.

  1. 백업 디렉터리 생성
    1-1. 데이터 백업 디렉터리
    1-2. 데이터 백업 로그 디렉터리 및 로그 파일

  2. 백업 스크립트 작성

  3. 리눅스 스케줄러 등록

🧑🏻‍💻 백업 디렉터리 생성

# 데이터 백업 디렉터리 생성
mkdir -p /backup/mysql/daily_full_backup

# 로그 디렉터리 생성
mkdir -p /backup/mysql/log
# 로그 파일 생성
touch /backup/mysql/log/backup.log

🧑🏻‍💻 백업 스크립트 작성

스크립트 파일의 경로는 상황에 따라(회사의 정책 및 규칙에 따라) 다르게 지정할 수 있다.

# 스크립트 생성 및 편집
vi /usr/local/bin/mysql_daily_backup.sh

[스크립트 내용]

  • 2>> ${LOG_FILE} : 표준 에러 발생 시 로그파일(backup.log)끝에 에러 추가
  • -mtime +7 : 수정된 지 7일 보다 오래된 파일
  • -exec rm -f {} \; : rm명령어 실행
    • { } : find가 찾은 파일명
    • \; : -exec 옵션의 끝을 의미
    • -f : 강제 삭제
#!/bin/bash
#-------------------------------------------------------------------------------------------------------------------------------------------
# 파 일 명 : /usr/local/bin/mysql_daily_backup.sh
# 설   명 : 매일 모든 데이터베이스 백업, 7일 전 백업 파일은 자동 삭제
# 작 성 자 : 김철수
# 작 성 일 : 2025.07.04
# 수 정 자 : -
# 수 정 일 : -
# 수 정 사 유: -
#-------------------------------------------------------------------------------------------------------------------------------------------

#-------------------------------------------------------------------------------------------------------------------------------------------
# 백업 변수 선언 START
#-------------------------------------------------------------------------------------------------------------------------------------------

# MySQL 계정 정보
MYSQL_USER="@@@@"
MYSQL_PWD="@@@@"

# 날짜 변수
TODAY=$(date +"%Y%m%d")

# 백업 위치
BACKUP_DIR="/backup/mysql/daily_full_backup"

# 백업 로그 위치
LOG_FILE="/backup/mysql/log/backup.log"

# 백업 파일명
BACKUP_FILE="${BACKUP_DIR}/${TODAY}_full_backup.sql"

#-------------------------------------------------------------------------------------------------------------------------------------------
# 백업 변수 선언 END
#-------------------------------------------------------------------------------------------------------------------------------------------


#-------------------------------------------------------------------------------------------------------------------------------------------
# 백업 로직 START
#-------------------------------------------------------------------------------------------------------------------------------------------

# mysqldump 백업 실행
mysqldump -u ${MYSQL_USER} -p${MYSQL_PWD} --all-databases --routines --events --single-transaction --quick > ${BACKUP_FILE} 2>> ${LOG_FILE}

# 백업 성공 여부 기록
if [ $? -eq 0 ]; then
	echo "$(date +"%Y-%m-%d %H:%M:%S") : Backup Success" >> ${LOG_FILE}
else
	echo "$(date +"%Y-%m-%d %H:%M:%S") : Backup Failed" >> ${LOG_FILE}
fi

# 7일 전 백업 파일 자동 삭제
find ${BACKUP_DIR} -type f -name "*.sql" -mtime +7 -exec rm -f {} \;

#-------------------------------------------------------------------------------------------------------------------------------------------
# 백업 로직 END
#-------------------------------------------------------------------------------------------------------------------------------------------

👩🏻‍💻 백업 스크립트 스케줄러 등록

# 리눅스 스케줄러 등록 명령어
crontab -e

위 명령어 실행 후 스케줄러 등록 화면으로 진입할 수 있으며 상황에 맞는 스케줄러를 등록하면 된다.

# 매일 새벽 2시에 스케줄러 실행
0 2 * * * /usr/local/bin/mysql_daily_backup.sh

스케줄러가 정상적으로 등록 되었는지 확인이 필요할 때는 아래 명령어를 통해 확인한다.

crontab -l

🔎 결과

리눅스 crontab 스케줄러가 정상적으로 실행될 경우 로그 파일(/backup/mysql/log/backup.log)에 성공(Success) 또는 실패(Failed) 내용을 추가하여 기록된다.

문제 발생 시 해당 로그 기록을 확인하여 적절한 추가 작업을 진행하면 된다.

0개의 댓글