首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux 下 MySQL 自動備份腳本:每日備份 + 7 天留存策略

     編輯:MySQL 綜合教學

Linux 下 MySQL 自動備份腳本:每日備份 + 7 天留存策略

生產環境標準化備份腳本:mysqldump 邏輯備份 + find 定期清理舊檔。支援多庫並行、日期命名、自動留存。

備份腳本完整版

#!/bin/bash
# 檔案:/usr/local/bin/mysql_daily_backup.sh
# 權限:chmod +x /usr/local/bin/mysql_daily_backup.sh
# 排程:crontab -e → 0 2 * * * /usr/local/bin/mysql_daily_backup.sh >> /var/log/mysql_backup.log 2>&1

# ===== 配置區 =====
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASS="StrongPass123!"
BACKUP_DIR="/backup/mysql"
DATABASES=("hz" "jshuabo" "sdhuabo")  # 多庫陣列
RETENTION_DAYS=7
MYSQLDUMP_PATH="/usr/bin/mysqldump"  # which mysqldump
DATE_FMT=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"

# ===== 函數區 =====
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

# ===== 主流程 =====
log "=== 開始每日備份 ==="

# 確保備份目錄存在
mkdir -p "$BACKUP_DIR"

# 遍歷資料庫備份
for db in "${DATABASES[@]}"; do
    log "備份資料庫: $db"
    BACKUP_FILE="${BACKUP_DIR}/${db}_${DATE_FMT}.sql"
    
    if "$MYSQLDUMP_PATH" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
       --single-transaction --routines --triggers --events --quick \
       --lock-tables=false "$db" > "$BACKUP_FILE" 2>>"$LOG_FILE"; then
        log "  ✅ 成功: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))"
        # 可選:壓縮
        gzip "$BACKUP_FILE"
        log "  📦 已壓縮: ${BACKUP_FILE}.gz"
    else
        log "  ❌ 失敗: $db"
    fi
done

# 清理舊備份(保留最近 N 天)
log "清理 $RETENTION_DAYS 天前的備份檔案..."
find "$BACKUP_DIR" -type f -name "*.sql*" -mtime +$RETENTION_DAYS -delete -print | while read f; do
    log "  🗑️ 刪除: $f"
done

log "=== 備份完成 ==="

關鍵參數解析

參數作用
--single-transactionInnoDB 熱備份核心:開啟一致性快照,不鎖表,不阻塞寫入
--routines --triggers --events包含存儲過程、觸發器、事件調度器
--quick逐行輸出,不緩衝全表結果集,減少記憶體
--lock-tables=false配合 single-transaction 確保不鎖表
-mtime +7find 刪除修改時間超過 7 天的檔案

部署步驟

  1. 建立腳本:vim /usr/local/bin/mysql_daily_backup.sh 貼上內容
  2. 授權:chmod +x /usr/local/bin/mysql_daily_backup.sh
  3. 測試:/usr/local/bin/mysql_daily_backup.sh
  4. 加入排程:crontab -e → 0 2 * * * /usr/local/bin/mysql_daily_backup.sh >> /var/log/mysql_backup.log 2>&1(每天凌晨 2 點)
  5. 驗證:ls -lh /backup/mysql/、tail -f /var/log/mysql_backup.log

進階增強(可選)

  • 上傳雲端:備份完成後用 rclone / aws s3 cp / ossutil 推送至 S3/OSS/COS
  • 加密:gpg --symmetric --cipher-algo AES256 backup.sql.gz
  • 驗證可還原:定期腳本隨機抽樣還原測試 mysql -u root -p test_db < backup.sql
  • 監控告警:腳本返回碼非 0 時發送郵件/鉤子/企業微信通知
  • 物理備份補充:大庫 (>100GB) 建議配合 Percona XtraBackup 物理熱備份,恢復速度快數量級

常見問題排查

現象原因解決
備份檔為 0 bytes密碼錯誤 / 權限不足 / mysqldump 路徑錯誤檢查 LOG_FILE、手動執行 mysqldump 指令驗證
備份過程報錯 "Access denied"備份帳號缺少 PROCESS/LOCK TABLES/REPLICATION CLIENT 權限GRANT PROCESS, REPLICATION CLIENT, LOCK TABLES ON *.* TO 'backup'@'localhost';
備份耗時過長影響業務單線程 mysqldump、大表無索引分庫並行、升級 XtraBackup 物理備份、從庫備份卸載主庫
清理不生效find 條件錯誤 / 檔案時間屬性異常用 find ... -mtime +7 -ls 先預覽
備份不驗證等於沒備份。核心指標:RPO(資料丟失容忍度)、RTO(恢復時間目標)。每日邏輯備份 + 週物理備份 + 異地雲端留存 + 季度還原演練,是生產級備份體系標配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved