資料庫備份是運維底線。本文提供一套經驗證的 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"
# 編輯 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