首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

基於 Innobackupex 的 MySQL 熱備份腳本:全量/增量自動化與郵件通知

     編輯:MySQL 綜合教學

基於 Innobackupex 的 MySQL 熱備份腳本:全量/增量自動化與郵件通知

腳本設計原則

  • 周日、三:全量備份
  • 周一、二、四、五、六:增量備份(基於最近一次全量/增量的 LSN)
  • 保留 5 天備份與日誌,自動清理過期檔案
  • 備份結果郵件通知(成功/失敗)

核心腳本片段

#!/bin/bash
# 參數解析:--backup-dir --defaults-file --host --port --user --password
# 環境初始化
physicalBackupDir=${backupDir}/physical
logDir=${backupDir}/log
checkPointDir=${backupDir}/checkpoint
cmdInno=/usr/bin/innobackupex
sock=/tmp/mysql.sock
day=$(date +%w)  # 0=Sun, 3=Wed
dt=$(date +%Y%m%d)
ts=$(date +%Y%m%d%H%M%S)

# 全量備份函數
back_full() {
  $cmdInno --user=$mysqlUser --password=$mysqlPassword --no-timestamp \
    --defaults-file=$defaultFile $physicalBackupDir/$dt/base_$dt --socket=$sock \
    2> ${logDir}/bak_${ts}.log
  # 提取 LSN 供下次增量使用
  grep last_lsn $physicalBackupDir/$dt/base_$dt/xtrabackup_checkpoints | cut -b 12- \
    > $checkPointDir/ckp_${dt}
}

# 增量備份函數
back_inc() {
  basedir=$physicalBackupDir/$(date -d "$1 days ago" +%Y%m%d)
  $cmdInno --user=$mysqlUser --password=$mysqlPassword --socket=$sock --no-timestamp \
    --defaults-file=$defaultFile --incremental $basedir/inc_$dt \
    --incremental-lsn=$(cat $checkPointDir/ckp_$(date -d "$1 days ago" +%Y%m%d)) \
    2> ${logDir}/bak_${ts}.log
  grep last_lsn $basedir/inc_$dt/xtrabackup_checkpoints | cut -b 12- \
    > $checkPointDir/ckp_$dt
}

# 排程邏輯
case $day in
  0|3) back_full ;;                    # Sun, Wed
  1) back_inc 1 ;;                     # Mon 基於 Sun
  2) back_inc 2 ;;                     # Tue 基於 Mon
  4) back_inc 1 ;;                     # Thu 基於 Wed
  5) back_inc 2 ;;                     # Fri 基於 Thu
  6) back_inc 3 ;;                     # Sat 基於 Fri
esac

# 清理 5 天前檔案
find $physicalBackupDir -type f -mtime +5 -exec rm {} \;
find $logDir -type f -mtime +5 -exec rm {} \;

# 郵件通知
if grep -q "innobackupex: completed OK!" $logFile; then
  mutt -s "MySQL 熱備份成功 $(hostname)" $mailadd < $logFile
else
  mutt -s "MySQL 熱備份失敗 $(hostname)" $mailadd < $logFile
fi

部署範例

# 呼叫腳本
cat /db_scripts/call_innobk.sh
#!/bin/bash
/db_scripts/innobk.sh --backup-dir=/data/backup --host=127.0.0.1 --port=3306 --user=innobk --password=InnoBK

# Crontab 定時任務
0 3 * * * /db_scripts/call_innobk.sh

# 備份目錄結構
/data/backup/
├── checkpoint/   # LSN 檢查點
├── log/          # 詳細日誌
└── physical/
    ├── 20150107/
    │   ├── base_20150107/   # 全量
    │   ├── inc_20150108/    # 增量
    │   ├── inc_20150109/
    │   └── inc_20150110/

關鍵優勢

  • 免停機熱備份,不阻塞寫入
  • 增量備份僅複製變更頁面,速度快、佔用小
  • LSN 鏈式追蹤確保增量鏈完整性
  • 自動清理與郵件告警,適合生產環境無人值守運行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved