InnoDB Hot Backup,大數據集 (TB 級) 首選| 工具 | 角色 | 適用場景 |
|---|---|---|
xtrabackup | 底層引擎,僅備份 InnoDB/XtraDB | 純 InnoDB 環境、自動化腳本調用 |
innobackupex | Perl 封裝腳本,集成 xtrabackup,支持 MyISAM (需全局讀鎖) | 混合引擎、生產環境標準入口 |
安裝包含:xtrabackup, xtrabackup_55, xtrabackup_56, innobackupex (兼容 1.5.1 軟鏈接)
| 參數 | 說明 |
|---|---|
--defaults-file | 指定 my.cnf 路徑 (讀取 datadir、innodb_log_* 等) |
--backup | 執行備份 |
--prepare | 備份後應用 Redo Log 使數據一致 (相當於崩潰恢復) |
--target-dir | 備份文件存放目錄 |
--incremental-basedir | 增量備份基準目錄 (全量或上級增量) |
--incremental-dir | 準備階段指定增量目錄合併 |
--stream=tar | 流式輸出 tar 流 (配合管道壓縮/遠程傳輸) |
--throttle | 限制 IOPS (每秒 I/O 操作數),減輕業務影響 |
--use-memory | Prepare 階段緩衝池大小 |
--tables | 正則匹配表名 (file-per-table 模式) |
#!/bin/bash
# xtra_full_backup.sh
DATE=$(date +%F)
BAK_DIR="/data/xtrabak/full_${DATE}"
mkdir -p ${BAK_DIR}
echo "Backup begin $(date)"
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=${BAK_DIR}
# 手動拷貝 .frm 結構文件 (xtrabackup 不備份)
cp -r /var/lib/mysql/test ${BAK_DIR}/
echo "Backup end $(date)"
#!/bin/bash
# xtra_full_prepare.sh
DATE=$(date +%F)
BAK_DIR="/data/xtrabak/full_${DATE}"
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=${BAK_DIR}
cp -r ${BAK_DIR}/test/ /var/lib/mysql/
rm -f /var/lib/mysql/ib*
cp ${BAK_DIR}/ib* /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysql
mkdir -p /data/xtrabak/full_$(date +%F) xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/xtrabak/full_$(date +%F) cp -r /var/lib/mysql/test/ /data/xtrabak/full_$(date +%F)/
mkdir -p /data/xtrabak/inc_$(date +%F) xtrabackup --defaults-file=/etc/my.cnf --backup \ --target-dir=/data/xtrabak/inc_$(date +%F) \ --incremental-basedir=/data/xtrabak/full_$(date +%F) cp -r /var/lib/mysql/test/ /data/xtrabak/full_$(date +%F)/ # 同步最新結構
關鍵點:增量目錄生成 .delta 文件,僅含變更頁;xtrabackup_checkpoints 記錄 from_lsn/to_lsn。
# 1. 準備全量 (應用 Redo Log) xtrabackup --prepare --target-dir=/data/xtrabak/full_$(date +%F) # 2. 合併增量到全量目錄 xtrabackup --prepare --target-dir=/data/xtrabak/full_$(date +%F) \ --incremental-dir=/data/xtrabak/inc_$(date +%F) # 3. 拷回數據目錄 cp -r /data/xtrabak/full_$(date +%F)/test/ /var/lib/mysql/ rm -f /var/lib/mysql/ib* cp /data/xtrabak/full_$(date +%F)/ib* /var/lib/mysql/ chown -R mysql:mysql /var/lib/mysql systemctl restart mysql
#!/bin/bash
# backup.sh
DATE=$(date +%F)
BAK_DIR="/data/xtrabak/bak_${DATE}"
LOG_FILE="${BAK_DIR}/innobackupex_${DATE}.log"
mkdir -p ${BAK_DIR}
echo "Backup begin $(date)"
innobackupex --user=root --password=xxx --defaults-file=/etc/my.cnf \
--stream=tar ${BAK_DIR} 2>${LOG_FILE} | gzip > ${BAK_DIR}/base.tar.gz
echo "Backup end $(date)"
# 備份配置文件
cp /etc/my.cnf /data/xtrabak/my_${DATE}.cnf
產出:base.tar.gz (壓縮流)、innobackupex.log (含 Binlog 位點)、my.cnf 備份。
#!/bin/bash
# binlog_bak.sh - 歸檔最近 1 小時 Binlog 到遠程 NFS
cd /var/lib/
DATE=$(date -d '-1 hour' +%Y%m%d%H00)
touch -t "${DATE}" starttemp
mount -t nfs 192.168.3.108:/logcenter /mnt_log
find /var/lib/mysql/mysql-bin.* -newer starttemp | xargs -I {} cp -p {} /mnt_log/mysql-binlog/192.168.3.28/
# umount /mnt_log
#!/bin/bash
# prepare.sh
DATE=$(date +%F)
PREP_DIR="/data/xtrabak/prepare_${DATE}"
mkdir -p ${PREP_DIR}
systemctl stop mysql
# 1. 解壓流式備份
tar -ixzvf /data/xtrabak/bak_${DATE}/base.tar.gz -C ${PREP_DIR}
# 2. 應用日志 (準備階段)
innobackupex --apply-log --user=root --defaults-file=/etc/my.cnf ${PREP_DIR}
# 3. 拷回數據目錄
innobackupex --copy-back --user=root --defaults-file=/etc/my.cnf ${PREP_DIR}
chown -R mysql:mysql /var/lib/mysql
rm -rf /var/lib/mysql/xtrabackup_binlog_pos_innodb
systemctl start mysql