萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

MySQL 自動化備份腳本:mysqldump + gzip + crontab 生產級方案

從手動備份到定時壓縮異地存儲的完整實施

資料庫備份是運維底線。本文提供一套經驗證的 Shell 腳本,支援定時、壓縮、保留策略,可直接用於生產環境。

備份腳本設計

#!/bin/bash
# /usr/local/bin/mysql_auto_backup.sh

# ===== 設定區 =====
DB_USER="backup_user"
DB_PASS="StrongPassword123"
DB_NAME="production_db"
BACKUP_DIR="/backup/mysql"
MYSQLDUMP="/usr/bin/mysqldump"
GZIP="/bin/gzip"
KEEP_DAYS=7          # 保留天數
DATE_FMT=$(date +"%Y%m%d_%H%M%S")
FILE_PREFIX="mysql_${DB_NAME}"
LOG_FILE="/var/log/mysql_backup.log"
# ==================

# 建立備份目錄
mkdir -p "$BACKUP_DIR"

# 執行備份並壓縮
BACKUP_FILE="${BACKUP_DIR}/${FILE_PREFIX}_${DATE_FMT}.sql.gz"

echo "[$(date)] 開始備份 $DB_NAME -> $BACKUP_FILE" >> "$LOG_FILE"

$MYSQLDUMP --single-transaction --routines --triggers --events \
  -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | $GZIP > "$BACKUP_FILE"

if [ $? -eq 0 ]; then
    echo "[$(date)] 備份成功,大小: $(du -h "$BACKUP_FILE" | cut -f1)" >> "$LOG_FILE"
else
    echo "[$(date)] 備份失敗!" >> "$LOG_FILE"
    exit 1
fi

# 清理舊備份
find "$BACKUP_DIR" -name "${FILE_PREFIX}_*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "[$(date)] 清理 $KEEP_DAYS 天前備份完成" >> "$LOG_FILE"

關鍵參數解析

  • `--single-transaction`:InnoDB 熱備份關鍵,不鎖表,保證一致性視圖
  • `--routines --triggers --events`:完整備份存儲過程、觸發器、事件
  • 管道串接 `gzip`:即時壓縮,節省磁碟 I/O 與空間
  • 日期格式含時分秒:避免同天多次備份覆蓋

crontab 定時任務

# 編輯 root 的 crontab
crontab -e

# 每天凌晨 2:30 執行
30 2 * * * /usr/local/bin/mysql_auto_backup.sh >> /var/log/mysql_backup_cron.log 2>&1

# 或每 6 小時備份一次 (視 RPO 需求)
# 0 */6 * * * /usr/local/bin/mysql_auto_backup.sh

進階擴展建議

  1. 異地複製:腳本末尾加 `rsync -avz $BACKUP_DIR/ user@offsite:/remote/backup/`
  2. 驗證機制:定期在測試環境 `gunzip -c backup.sql.gz | mysql -u root -p test_db` 驗證可還原性
  3. 監控告警:結合 Zabbix/Prometheus 監控備份檔案大小、修改時間、日誌錯誤關鍵字
  4. 權限最小化:備份帳號僅需 `SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS` 權限
copyright © 萬盛學電腦網 all rights reserved