Percona XtraBackup 是 MySQL/InnoDB 熱備份的標準工具,支持非阻塞全量/增量備份。本文記錄基於 xtrabackup 2.2.9 (MySQL 5.6.22) 的完整增量備份、恢復流程,並對比 innobackupex 封裝工具用法。
/home/data/mysql/data/data/backups/mysql/backup@192.168.%,權限:RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPERCREATE USER 'backup'@'192.168.%' IDENTIFIED BY '123456'; GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPER ON *.* TO 'backup'@'192.168.%';
xtrabackup --defaults-file=/etc/my.cnf \ --user=backup --password="123456" --port=3306 \ --backup --target-dir=/data/backups/mysql/full_incre_$(date +%Y%m%d) \ 2>/tmp/fullbackup.log
關鍵輸出:xtrabackup: The latest check point (for incremental): 'LSN_NUMBER' —— 記錄此 LSN 作為增量基準。
增量備份基於上一次備份 (全量或增量) 的 LSN,僅複製變更頁。
t4 並插入數據。xtrabackup --defaults-file=/etc/my.cnf --backup \ --user=backup --password="123456" --port=3306 \ --target-dir=/data/backups/mysql/incre_20150320 \ --incremental-basedir=/data/backups/mysql/full_incre_20150319 \ 2>/tmp/incre_backup_1.log
生成 .delta 文件,記錄新 LSN (如 423925813)。
t_incre_2 並插入數據。xtrabackup --defaults-file=/etc/my.cnf --backup \ --user=backup --password="123456" --port=3306 \ --target-dir=/data/backups/mysql/incre_20150321 \ --incremental-basedir=/data/backups/mysql/incre_20150320 \ 2>/tmp/incre_backup_2.log
恢復遵循:全量備份 prepare (--apply-log-only) → 依次 apply 每個增量 → 最後全量 prepare (無 --apply-log-only) → 複制回數據目錄。
xtrabackup --prepare --apply-log-only \ --target-dir=/data/backups/mysql/full_incre_20150319 \ 2>/tmp/full_restore.log
xtrabackup --prepare --apply-log-only \ --target-dir=/data/backups/mysql/full_incre_20150319 \ --incremental-dir=/data/backups/mysql/incre_20150320 \ 2>/tmp/restore_incre_1.log
xtrabackup --prepare --apply-log-only \ --target-dir=/data/backups/mysql/full_incre_20150319 \ --incremental-dir=/data/backups/mysql/incre_20150321 \ 2>/tmp/restore_incre_2.log
xtrabackup --prepare \ --target-dir=/data/backups/mysql/full_incre_20150319 \ 2>/tmp/restore_end_3.log
service mysqld5612 stop cd /data/backups/mysql/full_incre_20150319 rsync -rvt --exclude='xtrabackup_checkpoints' --exclude='xtrabackup_logfile' ./ /home/data/mysql/data chown -R mysql:mysql /home/data/mysql/data service mysqld5612 start
登入 MySQL,確認之前刪除的增量表數據 (t4, t_incre_2) 已恢復。
innobackupex 封裝 xtrabackup,自動處理非 InnoDB 表 (FRM、MYD、MYI)、鎖表、二進制日志位置記錄,操作更簡單。
innobackupex --defaults-file=/etc/my.cnf \ --user=backup --password="123456" --host=192.168.52.129 \ /data/backups/mysql/innobackupex_full_20150319/ --no-timestamp \ 2>/tmp/innobackupex_full.log
輸出關鍵信息:MySQL binlog position: filename 'mysql-bin.000066', position 120、completed OK!。
# 第一次增量 (基於全量) innobackupex --incremental /data/backups/mysql/innobackex_incre_1 \ --incremental-basedir=/data/backups/mysql/innobackupex_full_20150319/ \ --user=backup --password="123456" --host=192.168.52.129 --no-timestamp # 第二次增量 (基於第一次增量) innobackupex --incremental /data/backups/mysql/innobackex_incre_2 \ --incremental-basedir=/data/backups/mysql/innobackex_incre_1/ \ --user=backup --password="123456" --host=192.168.52.129 --no-timestamp
# 1. 準備全量 innobackupex --apply-log /data/backups/mysql/innobackupex_full_20150319/ # 2. 應用第一次增量 innobackupex --apply-log --incremental-dir=/data/backups/mysql/innobackex_incre_1 \ /data/backups/mysql/innobackupex_full_20150319/ # 3. 應用第二次增量 innobackupex --apply-log --incremental-dir=/data/backups/mysql/innobackex_incre_2 \ /data/backups/mysql/innobackupex_full_20150319/
service mysqld5612 stop mv /home/data/mysql/data/* /tmp/mysqldatabak/ innobackupex --copy-back /data/backups/mysql/innobackupex_full_20150319/ chown -R mysql:mysql /home/data/mysql/data service mysqld5612 start
--prepare 不加。