資料庫備份是災難恢復的最後防線。本文提供生產級MySQL定時備份Shell腳本,涵蓋mysqldump邏輯備份、tar.gz壓縮、歷史文件自動清理、錯誤處理與日誌記錄,可直接部署至cron定時執行。
mysqldump --single-transaction)tar.gz,節省90%+空間)crontab定時任務部署#!/bin/bash
# MySQL Auto Backup Script
# Author: liuzheng | Version: 1.0
# ===== 配置區 =====
DB_NAME="Bulletin_production"
DB_USER="root"
DB_PASS="" # 建議使用--defaults-extra-file避免明文密碼
BACKUP_PATH="/home/worker/mysql_backup/"
RETENTION_DAYS=1 # 保留天數
# ===== 變量衍生 =====
DATE_STR=$(date +%y%m%d)
TIME_STR=$(date +"%y-%m-%d %H:%M:%S")
NEW_FILE="${BACKUP_PATH}db${DATE_STR}.tar.gz"
DUMP_FILE="${BACKUP_PATH}db${DATE_STR}.sql"
OLD_FILE="${BACKUP_PATH}db$(date -d "${RETENTION_DAYS} days ago" +%y%m%d).tar.gz"
LOG_FILE="${BACKUP_PATH}backup.log"
# ===== 日誌函數 =====
log() { echo "[$TIME_STR] $1" | tee -a "$LOG_FILE"; }
# ===== 主流程 =====
log "---------------------------"
log "Backup started"
# 1. 確保備份目錄存在
mkdir -p "$BACKUP_PATH"
# 2. 清理舊備份
if [ -f "$OLD_FILE" ]; then
rm -f "$OLD_FILE"
log "[$OLD_FILE] Delete old file success"
else
log "Old backup file not exist: $OLD_FILE"
fi
# 3. 檢查今日備份是否已存在
if [ -f "$NEW_FILE" ]; then
log "[$NEW_FILE] Backup already exists, skip"
exit 0
fi
# 4. 執行邏輯備份
log "Executing mysqldump..."
if mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" > "$DUMP_FILE"; then
log "mysqldump completed"
else
log "ERROR: mysqldump failed"
exit 1
fi
# 5. 壓縮備份文件
log "Compressing backup..."
if tar -czf "$NEW_FILE" -C "$BACKUP_PATH" "$(basename "$DUMP_FILE")"; then
log "[$NEW_FILE] Compression success"
else
log "ERROR: Compression failed"
exit 1
fi
# 6. 清理臨時SQL文件
rm -f "$DUMP_FILE"
log "[$NEW_FILE] Backup completed successfully"
log "---------------------------"
exit 0
| 參數 | 建議值 | 說明 |
|---|---|---|
| --single-transaction | 必加 | InnoDB一致性備份不鎖表,需RELOAD/LOCK TABLES權限 |
| --routines --triggers | 必加 | 包含存儲過程/觸發器/事件 |
| --master-data=2 | 可選 | 輸出CHANGE MASTER語句(註釋形式),利於從庫搭建 |
| --defaults-extra-file | 推薦 | 避免腳本明文密碼,指向[client]密碼配置文件 |
chmod +x mysql_backup.sh./mysql_backup.sh 檢查backup.log與生成文件crontab -e → 0 2 * * * /path/mysql_backup.sh >/dev/null 2>&1(每日02:00執行)tar -tzf db240115.tar.gzrsync/scp推送至遠端存儲/雲對象存儲binlog或xtrabackup --incremental「備份未測試等於無備份」,建立備份→驗證→演練閉環,才是真正的資料安全保障。