Linux 環境下 Shell 腳本 + cron 實現 MySQL 每日自動備份,保留 6 代歸檔壓縮,支持異地同步與監控通知。
/usr/local/bin/mysql_daily_backup.sh
#!/bin/bash
# ===== 配置區 =====
BACKUP_DIR="/backup/mysql/daily"
MYSQL_USER="backup_user"
MYSQL_PASS="StrongPass#2024"
MYSQL_HOST="localhost"
RETENTION_DAYS=6
COMPRESS_CMD="gzip -9"
REMOTE_SYNC="rsync -avz --delete $BACKUP_DIR/ backup-user@offsite-server:/offsite/mysql-backup/"
NOTIFY_WEBHOOK="https://hooks.slack.com/services/XXX/YYY/ZZZ"
# ===================
set -euo pipefail
mkdir -p "$BACKUP_DIR"
cd "$BACKUP_DIR"
# 1. 輪轉舊備份 (保留最近 N 天)
find . -name 'mysql_full_*.sql.gz' -mtime +$RETENTION_DAYS -delete
# 2. 執行備份 (單事務、含常規對象、流式讀取)
DATE_STAMP=$(date +%F_%H%M)
BACKUP_FILE="mysql_full_${DATE_STAMP}.sql"
mysqldump -h"$MYSQL_HOST" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
--all-databases \
--single-transaction \
--routines --triggers --events \
--quick \
--max_allowed_packet=1G \
--hex-blob \
> "$BACKUP_FILE"
# 3. 壓縮
$COMPRESS_CMD "$BACKUP_FILE"
# 4. 完整性校驗
if ! gzip -t "${BACKUP_FILE}.gz"; then
echo "[ERROR] 備份文件壓縮校驗失敗" >&2
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"MySQL 備份校驗失敗: $(hostname) $DATE_STAMP\"}" \
"$NOTIFY_WEBHOOK"
exit 1
fi
# 5. 異地同步 (可選)
if [[ -n "$REMOTE_SYNC" ]]; then
eval "$REMOTE_SYNC"
fi
# 6. 成功通知
BACKUP_SIZE=$(du -h "${BACKUP_FILE}.gz" | cut -f1)
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"✅ MySQL 備份成功: $(hostname) $DATE_STAMP 大小: $BACKUP_SIZE\"}" \
"$NOTIFY_WEBHOOK"
echo "[INFO] 備份完成: ${BACKUP_FILE}.gz ($BACKUP_SIZE)"
# 編輯 root crontab
crontab -e
# 每天凌晨 2:30 執行 (低峰期)
30 2 * * * /usr/local/bin/mysql_daily_backup.sh >> /var/log/mysql_backup.log 2>&1
| 維度 | 建議 |
|---|---|
| 備份用戶最小權限 | GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS ON *.* TO 'backup_user'@'localhost' IDENTIFIED BY 'pass'; |
| 密碼安全 | 使用 --defaults-extra-file=/etc/mysql/backup.cnf (權限 600) 避免命令行洩露密碼 |
| 備份一致性驗證 | 定期 CHECKSUM TABLE / pt-table-checksum 對比主備數據一致性 |
| 異地存儲 | 最小 2 地域 (同城+異地),對象存儲 IA/Archive 級降低成本 |
| 恢複演練 | 每季度在隔離環境全量恢複 + PITR 驗證,記錄 RTO/RPO |
| 監控告警 | 備份失敗/文件過小/耗時異常/異地同步失敗 → 即時通知 (Slack/釘釘/郵件/短信) |