WEEK_NUM 強制類型。profile 載入環境變數,兼容 cron 定時執行。INNOBACKUPEX=innobackupex MYSQL_USER=root MYSQL_PASSWORD=root MYSQL_HOST=localhost MYSQL_PORT=3306 MY_CNF=/etc/my.cnf BACKUP_DIR=/mysql_backup FULLBACKUP_DIR=$BACKUP_DIR/full INCRBACKUP_DIR=$BACKUP_DIR/incre BACKUP_LOG_DIR=$BACKUP_DIR/log
innobackupex -v 確認工具存在。netstat -lnt | grep $MYSQL_PORT 確認 MySQL 監聽端口。mysql -s $MYSQL_CMD -e 'exit' 驗證連線認證。WEEK_NUM=$(date +%w) # 0=Sun, 1=Mon...6=Sat if [ $WEEK_NUM -eq 1 -o $WEEK_NUM -eq 2 -o $WEEK_NUM -eq 3 -o $WEEK_NUM -eq 5 -o $WEEK_NUM -eq 6 ]; then # 增量備份邏輯 elif [ $WEEK_NUM -eq 0 -o $WEEK_NUM -eq 4 ]; then # 全量備份邏輯 fi
$FULLBACKUP_DIR 取最新目錄名(按名稱倒序)。$INCRBACKUP_DIR/$LATEST_FULL 下找最新增量目錄;若無則以全量目錄為基準,否則以最新增量為基準。$INNOBACKUPEX --defaults-file=$MY_CNF $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMP_LOG 2>&1
check_innobackupex_fail() {
if [ -z "$(tail -2 $TMP_LOG | grep 'completed OK!')" ]; then
LogErrorMsg "備份失敗"; exit 1
fi
}
find $FULLBACKUP_DIR/ -mindepth 1 -maxdepth 1 -type d -mtime +7 -printf "%P\n" | while read efile; do rm -rf $FULLBACKUP_DIR/$efile rm -rf $INCRBACKUP_DIR/$efile done
/usr/local/bin/mysql_backup.sh,chmod +x。mysql 或 root 用戶加入 crontab:0 2 * * * /usr/local/bin/mysql_backup.sh(每天凌晨 2 點執行)。$BACKUP_LOG_DIR 下日誌,確認備份狀態。--copy-back 驗證備份可用性;若需恢復到故障時間點,需結合 Binlog 進行 PITR。文中已提供完整可執行 Shell 腳本,含顏色日誌函數、錯誤處理、過期清理等生產級特性,可直接投入使用。