資料備份是資料庫運維生命線。本文提供一個生產就緒的 Shell 腳本,實現「每日全備、GZIP 壓縮、7 天週輪轉、cron 定時執行」,並說明雙機異地備份擴展方向。
#!/bin/sh
# 設定區
BACKUP_DIR="/home/mysql-backup"
DB_USER="backup_user"
DB_PASS="StrongPassword"
DB_HOST="localhost"
RETENTION_DAYS=7
# 進入備份目錄
cd "$BACKUP_DIR" || exit 1
# 週輪轉:刪除最舊、依序遞增編號
rm -f alldb.$RETENTION_DAYS.tar.gz
for i in $(seq $((RETENTION_DAYS-1)) -1 1); do
mv -f "alldb.$i.tar.gz" "alldb.$((i+1)).tar.gz" 2>/dev/null
done
mv -f alldb.0.tar.gz alldb.1.tar.gz 2>/dev/null
# 匯出全庫(含常規、觸發器、事件、Binlog座標)
mysqldump --single-transaction --master-data=2 --routines --triggers --events \
--quick --extended-insert --set-charset \
-h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" --all-databases > alldb.sql
# 壓縮存檔
tar -czf alldb.0.tar.gz alldb.sql
rm -f alldb.sql
# 可選:同步至遠端備份機(需 SSH 金鑰免密登入)
# rsync -avz --delete "$BACKUP_DIR/" backup_user@backup-server:/remote/mysql-backup/
mkdir -p /home/mysql-backup
chmod 755 /root/mysql-daily-backup.sh
chown root:root /root/mysql-daily-backup.sh
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPassword';
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER
ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
crontab -e
# 加入以下行
0 3 * * * /root/mysql-daily-backup.sh >> /var/log/mysql-backup.log 2>&1
| 特性 | 實現方式 | 效益 |
|---|---|---|
| 週輪轉保留 | 編號遞增 + 刪除最舊 | 固定磁碟佔用,無需手動清理 |
| 線上熱備份 | --single-transaction | InnoDB 不鎖表,業務零影響 |
| 完整元數據 | --routines --triggers --events --master-data=2 | 可直接用於主從搭建、時間點恢複 |
| 壓縮存檔 | tar -czf | 節省 70-90% 磁碟空間 |
| 異地同步就緒 | 預留 rsync 行 | 啟用即成雙機備份 |
rsync 行,每日備份後自動推送。「每日全備 + 週輪轉 + 壓縮 + 異地同步 + 季度恢複演練」是中小型 MySQL 環境的標準備份基線。本腳本開箱即用,請根據資料量調整保留天數、壓縮等級、同步頻率,並納入監控告警體系(備份失敗、磁碟空間不足、檔案大小異常)。