一、本地自動備份(Crontab + Shell)
1. 設定排程
# 每天 03:30 執行
0 3 * * * /usr/bin/mysql_backup.sh
2. 備份腳本 /usr/bin/mysql_backup.sh
#!/bin/bash
# 保留 6 份歷史備份(滾動輪轉)
BAK_DIR="/home/backup/mysql"
DB_NAME="mydb"
DB_USER="root"
DB_PASS="password"
cd "$BAK_DIR"
# 滾動重命名:bak6 → 刪除,bak5→bak6 ... bak1→bak2
for i in {6..2}; do
[ -f "db_bak$((i-1)).tgz" ] && mv "db_bak$((i-1)).tgz" "db_bak${i}.tgz"
done
rm -f db_bak.txt
# 匯出並壓縮
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" > db_bak.txt
tar czf db_bak1.tgz db_bak.txt
# 可選:上傳至遠端
# scp db_bak1.tgz user@remote:/backup/mysql/
# 或用 lftp/curl 上傳 FTP
關鍵參數說明
--single-transaction:InnoDB 熱備份不鎖表(需啟用事務)。
--routines --triggers:包含儲存程序/觸發器。
--master-data=2:在輸出加入 CHANGE MASTER TO 註解,記錄 binlog 位置,利於從庫搭建。
二、遠程同步方案
| 方式 | 指令範例 | 優點 | 缺點 |
| SCP/SSH | scp -i key.pem db_bak1.tgz user@host:/path/ | 加密、標準、免密金鑰 | 需 SSH 服務 |
| rsync | rsync -avz -e ssh db_bak1.tgz user@host:/path/ | 增量傳輸、斷點續傳 | 雙端需 rsync |
| FTP (lftp) | lftp -e "put db_bak1.tgz; bye" -u user,pass ftp://host | 通用、防火牆友善 | 明文傳輸、較慢 |
| 雲存儲 (AWS S3) | aws s3 cp db_bak1.tgz s3://bucket/mysql/ | 高耐久、多區域 | 需 CLI 設定 |
三、進階建議
- 異地多備:至少兩地(如 IDC + 雲),防單點災難。
- 定期驗證還原:每季在測試環境
mysql < db_bak.txt 驗證完整性。
- 監控告警:腳本回傳非 0 碼時發送郵件/Slack/Telegram 通知。
mysqldump 大表加 --quick 避免記憶體暴增。
- 生產環境建議使用
Percona XtraBackup(物理熱備份、速度快、不阻塞)。