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

MySQL xtrabackup 增量備份與恢復完整實戰指南

     編輯:MySQL 綜合教學

MySQL xtrabackup 增量備份與恢復完整實戰指南

Percona XtraBackup 是 MySQL/InnoDB 熱備份的標準工具,支持非阻塞全量/增量備份。本文記錄基於 xtrabackup 2.2.9 (MySQL 5.6.22) 的完整增量備份、恢復流程,並對比 innobackupex 封裝工具用法。

環境準備

  • MySQL 5.6.22,數據目錄 /home/data/mysql/data
  • 備份目錄 /data/backups/mysql/
  • 備份用戶 backup@192.168.%,權限:RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPER

1. 創建備份用戶

CREATE USER 'backup'@'192.168.%' IDENTIFIED BY '123456';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPER ON *.* TO 'backup'@'192.168.%';

2. 全量備份 (Base Backup)

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 作為增量基準。

3. 增量備份流程

增量備份基於上一次備份 (全量或增量) 的 LSN,僅複製變更頁。

3.1 第一次增量備份

  1. 製造增量數據:創建表 t4 並插入數據。
  2. 執行增備:
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)。

3.2 第二次增量備份

  1. 製造新增量數據:創建表 t_incre_2 並插入數據。
  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

4. 增量恢復 (Prepare & Apply)

恢復遵循:全量備份 prepare (--apply-log-only) → 依次 apply 每個增量 → 最後全量 prepare (無 --apply-log-only) → 複制回數據目錄。

4.1 準備全量備份 (僅 redo apply,不 rollback 未提交事務)

xtrabackup --prepare --apply-log-only \
  --target-dir=/data/backups/mysql/full_incre_20150319 \
  2>/tmp/full_restore.log

4.2 應用第一次增量

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

4.3 應用第二次增量

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

4.4 最後完整 prepare (執行 rollback 未提交事務,生成可用數據文件)

xtrabackup --prepare \
  --target-dir=/data/backups/mysql/full_incre_20150319 \
  2>/tmp/restore_end_3.log

4.5 替換數據目錄並啟動

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

4.6 驗證

登入 MySQL,確認之前刪除的增量表數據 (t4, t_incre_2) 已恢復。

5. innobackupex 封裝工具實戰 (推薦生產使用)

innobackupex 封裝 xtrabackup,自動處理非 InnoDB 表 (FRM、MYD、MYI)、鎖表、二進制日志位置記錄,操作更簡單。

5.1 全量備份

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!。

5.2 增量備份 (鏈式:基於上一增量)

# 第一次增量 (基於全量)
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

5.3 增量恢復 (合併到全量目錄)

# 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/

5.4 還原數據目錄

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

6. 關鍵經驗總結

  1. 增量鏈不可斷: 每次增量必須基於上一次備份目錄 (全量或增量),LSN 必須連續。
  2. --apply-log-only 關鍵: 中間合併階段必須加此參數,防止過早 rollback 未提交事務;最後一次 --prepare 不加。
  3. innobackupex 更省心: 自動處理非 InnoDB 文件、FLUSH TABLES WITH READ LOCK、binlog 位置記錄,生產首選。
  4. 備份用戶最小權限原則: 僅授予必要權限。
  5. 定期驗證恢復: 僅備份不測試 = 無備份。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved