腳本功能特色
- 週日全量、其它日增量(
tar -g 快照檔)。
- 全庫
mysqldump + gzip -9 壓縮。
lftp 自動上傳至遠端 FTP(目錄按日期分層)。
- 上傳失敗發送郵件告警,成功自動清理本地暫存。
核心變數配置區
DIRS="/home/www" # 檔案備份目錄
BACKUP="/tmp/backup.$$" # 暫存目錄
INCFILE="/home/www/inc.snar" # 增量快照檔
FULLBACKUP="7" # 週日(7)全量
MUSER="backup_user" # MySQL 備份帳號
MPASS="strong_password"
MHOST="127.0.0.1"
FTPD="/backup/mysql" # FTP 根目錄
FTPU="ftp_user"
FTPP="ftp_pass"
FTPS="backup.example.com"
EMAILID="dba@example.com"
關鍵邏輯片段
# 判斷全量/增量
if [ "$(date +%u)" == "$FULLBACKUP" ]; then
FILE="fs-full-$(date +%F).tar.gz"
tar -zcvf "$BACKUP/$FILE" "$DIRS"
else
FILE="fs-inc-$(date +%F-%Hh%Mm%Ss).tar.gz"
tar -g "$INCFILE" -zcvf "$BACKUP/$FILE" "$DIRS"
fi
# MySQL 全庫備份
DBS=$(mysql -u"$MUSER" -h"$MHOST" -p"$MPASS" -Bse 'SHOW DATABASES')
for db in $DBS; do
mysqldump -u"$MUSER" -h"$MHOST" -p"$MPASS" "$db" | gzip -9 > "$BACKUP/mysql-$db.$(date +%F-%T).gz"
done
# lftp 上傳
lftp -u "$FTPU,$FTPP" "$FTPS" <
部署建議
- 建立專用備份帳號:
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost' IDENTIFIED BY 'strong_password';
crontab -e:0 2 * * * /opt/scripts/mysql_backup.sh >/dev/null 2>&1(每天 02:00 執行)。
- 定期測試恢復:
gunzip < backup.sql.gz | mysql -u root -p test_db。
- 生產環境建議改用
xtrabackup (Percona) 實現 InnoDB 熱備份、流式傳輸、增量合併,效能遠優於 mysqldump。