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-transaction | InnoDB 熱備份核心:開啟一致性快照,不鎖表,不阻塞寫入 |
--routines --triggers --events | 包含存儲過程、觸發器、事件調度器 |
--quick | 逐行輸出,不緩衝全表結果集,減少記憶體 |
--lock-tables=false | 配合 single-transaction 確保不鎖表 |
-mtime +7 | find 刪除修改時間超過 7 天的檔案 |
部署步驟
- 建立腳本:
vim /usr/local/bin/mysql_daily_backup.sh 貼上內容
- 授權:
chmod +x /usr/local/bin/mysql_daily_backup.sh
- 測試:
/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(每天凌晨 2 點)
- 驗證:
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(恢復時間目標)。每日邏輯備份 + 週物理備份 + 異地雲端留存 + 季度還原演練,是生產級備份體系標配。