개요
-
MariaDB 장애 시 복구를 위한 일일 백업 설정 시 참고합니다.
-
주로 mysqldump를 사용하지만, 해당 가이드에서는 mariabackup을 사용하여 스크립트 내 계정 정보 노출 방지를 목적으로 작성하였습니다.
-
mariabackup은 mysqldump에 비해 백업/복구 속도가 빠르고, 서비스 중 영향이 적습니다.
단, 물리적 백업이기에 파일 용량이 크고 복구 전/후 MariaDB 버전이 동일해야합니다.
백업
-
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가 출력되면 정상입니다.
-
-
스크립트 생성
-
#!/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 "============================================"
-
-
권한 부여
chmod +x mariabackup.sh -
cron 등록 ( 매일 새벽 2시 )
crontab -e 0 2 * * * /logpresso/mariabackup/mariabackup.sh
복구
- MariaDB 전체 복구를 기준으로 함
-
MariaDB 중지
sudo systemctl stop mariadb -
기존 데이터 보관
mv /var/lib/mysql /var/lib/mysql_old mkdir /var/lib/mysql chown -R mysql:mysql /var/lib/mysql -
복구 파일 압축 해제
tar -xzf /logpresso/mariabackup/full_20260519_000000.tar.gz -
복구
mariabackup --copy-back --target-dir=/logpresso/mariabackup/full_20260519_000000 -
MariaDB 기동
sudo systemctl start mariadb