Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

XtraBackup 基础教程

覆盖:核心原理、备份类型、使用方法、恢复流程、性能优化、与 mysqldump/mydumper 对比、生产最佳实践。

🧱 1. XtraBackup 是什么?

XtraBackup(Percona XtraBackup) 是 MySQL / MariaDB 最专业的 物理热备工具,支持 InnoDB 的 无锁备份(hot backup),企业生产最常用。

特点:

  • 物理备份(拷贝数据文件,而不是导出 SQL)
  • 不阻塞读写(hot backup)
  • 支持 全备、增量备份、差异备份
  • 备份速度极快(文件级别)
  • 支持 redo + undo 恢复一致性
  • 可用于 MySQL、Percona Server、MariaDB

🔥 XtraBackup 可认为是 MySQL 物理备份的工业标准。

🧱 2. 适用场景(企业常用)

  • 在线备份,不中断业务
  • 数据库超过 50GB、100GB、甚至数 TB
  • MHA / MGR / PXC 集群节点复制
  • 做从库、延迟库
  • 自动备份脚本
  • 灾难恢复(DR)

如果你是运维 / DBA,在企业里基本离不开它。

🧱 3. 核心原理(回复2深度内容融合)

XtraBackup 的原理基于:

(1)拷贝 InnoDB 表空间/日志文件(物理方式)

逐文件复制:

ibdata1
*.ibd
redo log
undo log

(2)MVCC + redo log 保证一致性

备份过程中:

  1. 拷贝文件
  2. 同时记录 redo log
  3. 最后通过 xtrabackup –prepare 应用 redo,使数据达到统一时间点的 crash-consistent 状态

类似 MySQL 在崩溃恢复时的 redo 回放。

(3)对 MyISAM 需要短暂表锁

因为 MyISAM 没有 MVCC,只能锁表保证一致性。

🧱 4. XtraBackup 备份类型(完整)

类型 说明 是否锁表
完全备份(Full Backup) 拷贝全部数据文件 不锁 InnoDB
增量备份(Incremental) 仅备份比上次备份更新的页面 不锁 InnoDB
差异备份(Differential) 基于最近一次完全备份的差异 不锁 InnoDB
流备份(Stream Backup) 备份并通过管道输出(如 .xbstream) 不锁
备份压缩 使用 qpress/zstd 不锁

🧱 5. 基础使用(最常用命令)

5.1 完全备份

xtrabackup --backup \
--target-dir=/data/backup/full_2025_01_01

5.2 增量备份

xtrabackup --backup \
  --target-dir=/backup/inc1 \
  --incremental-basedir=/backup/full_2025_01_01

5.3 合并增量(prepare)

必须执行 prepare 才能恢复。

xtrabackup --prepare \
  --target-dir=/backup/full_2025_01_01

反复 prepare 合并增量:

xtrabackup --prepare \
  --target-dir=/backup/full_2025_01_01 \
  --incremental-dir=/backup/inc1

5.4 恢复(restore)

systemctl stop mysql

rsync -avP /backup/full_2025_01_01/ /var/lib/mysql/

chown -R mysql:mysql /var/lib/mysql/

systemctl start mysql

🧱 6. 备份流程图(增强说明)

Backup Stage:

  1. 拷贝数据文件
  2. 拷贝 redo
  3. 生成 xtrabackup_logfile(保证一致性)

Prepare Stage:

  1. 回放 redo
  2. 清理未提交事务
  3. 生成 crash-consistent 数据包

prepare 过程是 XtraBackup 的核心。

🧱 7. XtraBackup 备份 + 恢复完整流程(企业常用)

(1)完全备份

xtrabackup --backup --compress --target-dir=/backup/full

(2)增量备份

每天做:

xtrabackup --backup --incremental --incremental-basedir=/backup/full --target-dir=/backup/inc1

(3)prepare(多次 prepare 合并)

xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
xtrabackup --prepare --target-dir=/backup/full

(4)恢复

rsync -avP /backup/full/ /var/lib/mysql/

🧱 8. 性能优化(重要)

8.1 提升备份速度

  • 使用 SSD(极大提升)
  • 增大 –parallel=4/8/16
  • 使用 –compress + zstd(压缩极快)
  • 使用 –encrypt(需要安全性时)

示例:

xtrabackup --backup --parallel=8 --compress --compress-threads=8

✔ 8.2 提升恢复速度

  • prepare 时增加并行度:

    --prepare --parallel=8
    
  • 恢复时使用 rsync 替代 cp

🧱 9. XtraBackup vs mysqldump / mydumper(深度对比)

工具 类型 速度 一致性 锁表 恢复速度
XtraBackup 物理 极快 无锁(InnoDB) 极快
mysqldump 逻辑 需加锁 锁表
mydumper 逻辑多线程 中等~快 可快照 无锁 中等

结论:

  • 大型数据库(>50GB) -> XtraBackup
  • 中小规模,需迁移到不同版本 -> mydumper
  • 仅导数据结构或小数据 -> mysqldump

🧱 10. XtraBackup 的问题与注意事项

⚠️ 10.1 MySQL 8.0 与 XtraBackup 兼容性要严格

XtraBackup 与 MySQL版本强相关:

MySQL 版本 XtraBackup 版本
MySQL 8.x Percona XtraBackup 8.x
MySQL 5.7 XtraBackup 2.4

不能混用。

⚠️ 10.2 加密备份需要 key 文件

xtrabackup --backup --encrypt=AES256 --encrypt-key=mykey

⚠️ 10.3 prepare 必须成功,否则无法恢复

  • prepare 会回放 redo
  • prepare 失败 = 备份无效(非常关键)

🧱 11. 企业级最佳实践(重点)

11.1 每天至少一次完全备

11.2 增量备份最长不要超过 7 天

链太长 prepare 时间巨大

11.3 用脚本自动化(可提供脚本模板)

  • 自动备份
  • 自动 prepare
  • 自动推送到对象存储(OSS/OBS/S3)
  • 自动校验

11.4 每周做恢复演练(非常重要)

备份不演练 = 等于没有备份

11.5 配合 binlog 实现 point-in-time recovery(PITR)

完整恢复策略:

全备 -> 增量 -> binlog replay(point-in-time)

🧱 12. 最终总结(极速复盘)

  • XtraBackup 是 MySQL 的热备神器
  • 支持完整、增量、流式备份
  • prepare 才能让备份可恢复
  • 恢复极快
  • MySQL 8 需使用 Percona XtraBackup 8
  • 大型数据库强烈推荐 XtraBackup + binlog 的方案
  • 企业必须搭配自动化脚本与定期恢复演练

Percona XtraBackup (PXB) 是用于 MySQL 的开源物理热备工具,支持全量与增量备份

全量备份流程包括:备份数据文件 (–backup)、准备数据 (–prepare) 以确保一致性、恢复数据 (–copy-back),最后调整权限并重启服务。

一、 XtraBackup 全量备份 (Backup)

全量备份将数据库所有文件复制到指定目录。

  1. 执行备份命令:

    xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backups/full_base --user=root --password=your_password
    
    • --backup: 执行备份模式。
    • --target-dir: 备份文件存储目录。
  2. 验证备份:查看备份目录下的 xtrabackup_checkpoints 文件,确保最后一行显示 backup_type = full-backuped

二、 准备备份数据 (Prepare)

备份完成后,数据文件不一致,需要应用 Redo Log 使数据达到一致性状态,此步骤必须在恢复前执行。

xtrabackup --prepare --target-dir=/data/backups/full_base
  • --prepare: 对备份数据进行准备。此操作会应用 redo 日志并回滚未提交的事务。

三、 恢复全量备份 (Restore)

将准备好的一致性数据文件复制回 MySQL 数据目录。

  1. 停止 MySQL 服务

    systemctl stop mysqld
    
  2. 清空数据目录

    确保数据目录 datadir 为空(通常是 /var/lib/mysql)。

    rm -rf /var/lib/mysql/*
    
  3. 恢复数据

    xtrabackup --copy-back --target-dir=/data/backups/full_base
    
    • --copy-back: 将备份文件从备份目录复制回 MySQL 的数据目录。
  4. 修改权限与重启

    chown -R mysql:mysql /var/lib/mysql
    systemctl start mysqld
    

关键点总结

  • 一致性--prepare 阶段是必须的,它将备份时间点的不一致数据文件恢复到一致状态。
  • 目录要求--copy-back 要求目标数据库目录(datadir)为空。
  • 权限:恢复数据后,必须将目录所有者修改为 mysql 用户。

工具版本:XtraBackup 8.0 用于 MySQL 8.0,早期版本(如 2.4)用于 MySQL 5.7。

示例:

mkdir -p /data/mysql/8.0/backup/full

# rm -rf /data/mysql/8.0/backup/full/20260101

# 全量备份
# 不要添加 --compress 参数
# 否则恢复时会出现错误:
# 2026-01-01T21:26:36.470732+08:00 0 [ERROR] [MY-011825] [Xtrabackup] cannot open ./xtrabackup_info
# 2026-01-01T21:26:36.470745+08:00 0 [ERROR] [MY-011825] [Xtrabackup] Failed to parse xtrabackup_info from './xtrabackup_info'
xtrabackup --backup --user=root --password='KdX3V7nC!9#Q' --target-dir=/data/mysql/8.0/backup/full/20260101

xtrabackup --prepare --target-dir=/data/mysql/8.0/backup/full/20260101

systemctl stop mysqld

mv /data/mysql/8.0/data /data/mysql/8.0/data_bak

# rm -rf /data/mysql/8.0/data

mkdir -p /data/mysql/8.0/data

rsync -avP /data/mysql/8.0/backup/full/20260101/ /data/mysql/8.0/data/

xtrabackup --copy-back --target-dir=/data/mysql/8.0/backup/full/20260101

chown -R mysql:mysql /data/mysql/8.0/data

systemctl start mysqld

# 增量备份
mkdir -p /data/mysql/8.0/backup/incremental
xtrabackup --backup --user=root --password='KdX3V7nC!9#Q' \
    --incremental-basedir=/data/mysql/8.0/backup/full/20260101 \
    --target-dir=/data/mysql/8.0/backup/incremental/20260101_001