MariaDB 백업 및 복구 가이드

개요

  • MariaDB 장애 시 복구를 위한 일일 백업 설정 시 참고합니다.

  • 주로 mysqldump를 사용하지만, 해당 가이드에서는 mariabackup을 사용하여 스크립트 내 계정 정보 노출 방지를 목적으로 작성하였습니다.

  • mariabackup은 mysqldump에 비해 백업/복구 속도가 빠르고, 서비스 중 영향이 적습니다.
    단, 물리적 백업이기에 파일 용량이 크고 복구 전/후 MariaDB 버전이 동일해야합니다.

백업

  1. DB 내 백업용 계정 생성

    • OS에 동일한 계정이 있어야 함 ( logpresso )

      CREATE USER 'logpresso'@'localhost' IDENTIFIED VIA unix_socket;
      GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'logpresso'@'localhost';
      
      FLUSH PRIVILEGES;
      
    • 권한 설정

      # mysql 그룹에 추가
      usermod -aG mysql logpresso
      
      # 그룹 디렉토리 읽기 권한 확인 (이미 r-x면 생략 가능)
      ls -ld /var/lib/mysql
      
      # 그룹 권한이 없을 시
      sudo chmod 750 /var/lib/mysql
      
    • 확인

      # logpresso 계정으로 접속 테스트
      sudo -u logpresso mysql -e "SELECT current_user();"
      
      logpresso@localhost가 출력되면 정상입니다.
      
  2. 스크립트 생성

    • #!/bin/bash
      # /home/logpresso/scripts/mariabackup.sh
      
      set -e
      set -o pipefail
      export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      
      # === 설정 ===
      BACKUP_ROOT="/logpresso/mariabackup"
      DATE=$(date +%Y%m%d_%H%M%S)
      TMP_DIR="${BACKUP_ROOT}/tmp_${DATE}"
      BACKUP_FILE="${BACKUP_ROOT}/full_${DATE}.tar.gz"
      LOG_FILE="${BACKUP_ROOT}/backup.log"
      RETENTION_DAYS=7
      
      # === 함수 ===
      log() {
          echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
      }
      
      cleanup_on_error() {
          log "❌ 에러 발생. 임시 디렉토리 정리 중..."
          [ -d "${TMP_DIR}" ] && rm -rf "${TMP_DIR}"
          [ -f "${BACKUP_FILE}" ] && [ ! -s "${BACKUP_FILE}" ] && rm -f "${BACKUP_FILE}"
          exit 1
      }
      
      # 에러 발생 시 cleanup_on_error 호출
      trap cleanup_on_error ERR
      
      # === 백업 시작 ===
      mkdir -p "${BACKUP_ROOT}"
      log "============================================"
      log "백업 시작"
      log "임시 디렉토리: ${TMP_DIR}"
      log "최종 백업파일: ${BACKUP_FILE}"
      
      # 1. 백업
      log "[1/4] mariabackup 실행 중..."
      mariabackup --backup \
          --user=logpresso \
          --target-dir="${TMP_DIR}" 2>> "${LOG_FILE}"
      
      if [ ! -d "${TMP_DIR}" ] || [ ! -f "${TMP_DIR}/xtrabackup_checkpoints" ]; then
          log "❌ 백업 디렉토리가 정상적으로 생성되지 않았습니다"
          cleanup_on_error
      fi
      log "[1/4] 백업 완료"
      
      # 2. Prepare
      log "[2/4] Prepare 실행 중..."
      mariabackup --prepare --target-dir="${TMP_DIR}" 2>> "${LOG_FILE}"
      log "[2/4] Prepare 완료"
      
      # 3. 압축 (tar.gz)
      log "[3/4] 압축 중..."
      tar -czf "${BACKUP_FILE}" -C "${BACKUP_ROOT}" "tmp_${DATE}" 2>> "${LOG_FILE}"
      
      if [ ! -f "${BACKUP_FILE}" ] || [ ! -s "${BACKUP_FILE}" ]; then
          log "❌ 압축 파일이 정상적으로 생성되지 않았습니다"
          cleanup_on_error
      fi
      
      SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
      log "[3/4] 압축 완료 (크기: ${SIZE})"
      
      # 4. 임시 디렉토리 삭제
      log "[4/4] 임시 디렉토리 삭제 중..."
      rm -rf "${TMP_DIR}"
      log "[4/4] 정리 완료"
      
      # 5. 오래된 백업 정리
      DELETED=$(find "${BACKUP_ROOT}" -maxdepth 1 -name "full_*.tar.gz" -mtime +${RETENTION_DAYS} -print -delete | wc -l)
      if [ "${DELETED}" -gt 0 ]; then
          log "${RETENTION_DAYS}일 이상 된 백업 ${DELETED}개 삭제"
      fi
      
      # 혹시 남아있을 수 있는 오래된 임시 디렉토리도 정리 (1일 이상)
      find "${BACKUP_ROOT}" -maxdepth 1 -type d -name "tmp_*" -mtime +1 -exec rm -rf {} \; 2>/dev/null || true
      
      log "✅ 백업 작업 완료: ${BACKUP_FILE} (${SIZE})"
      log "============================================"
      
  3. 권한 부여

    chmod +x mariabackup.sh
    
  4. cron 등록 ( 매일 새벽 2시 )

    crontab -e 
    
    0 2 * * * /logpresso/mariabackup/mariabackup.sh
    

복구

  • MariaDB 전체 복구를 기준으로 함
  1. MariaDB 중지

    sudo systemctl stop mariadb
    
  2. 기존 데이터 보관

    mv /var/lib/mysql /var/lib/mysql_old
    mkdir /var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql
    
  3. 복구 파일 압축 해제

    tar -xzf /logpresso/mariabackup/full_20260519_000000.tar.gz
    
  4. 복구

    mariabackup --copy-back --target-dir=/logpresso/mariabackup/full_20260519_000000
    
  5. MariaDB 기동

    sudo systemctl start mariadb