XtraBackup 基础教程
覆盖:核心原理、备份类型、使用方法、恢复流程、性能优化、与 mysqldump/mydumper 对比、生产最佳实践。
XtraBackup(Percona XtraBackup) 是 MySQL / MariaDB 最专业的 物理热备工具,支持 InnoDB 的 无锁备份(hot backup),企业生产最常用。
特点:
- 物理备份(拷贝数据文件,而不是导出 SQL)
- 不阻塞读写(hot backup)
- 支持 全备、增量备份、差异备份
- 备份速度极快(文件级别)
- 支持 redo + undo 恢复一致性
- 可用于 MySQL、Percona Server、MariaDB
🔥 XtraBackup 可认为是 MySQL 物理备份的工业标准。
- 在线备份,不中断业务
- 数据库超过 50GB、100GB、甚至数 TB
- MHA / MGR / PXC 集群节点复制
- 做从库、延迟库
- 自动备份脚本
- 灾难恢复(DR)
如果你是运维 / DBA,在企业里基本离不开它。
XtraBackup 的原理基于:
逐文件复制:
ibdata1
*.ibd
redo log
undo log
备份过程中:
- 拷贝文件
- 同时记录 redo log
- 最后通过 xtrabackup –prepare 应用 redo,使数据达到统一时间点的 crash-consistent 状态
类似 MySQL 在崩溃恢复时的 redo 回放。
因为 MyISAM 没有 MVCC,只能锁表保证一致性。
| 类型 | 说明 | 是否锁表 |
|---|---|---|
| 完全备份(Full Backup) | 拷贝全部数据文件 | 不锁 InnoDB |
| 增量备份(Incremental) | 仅备份比上次备份更新的页面 | 不锁 InnoDB |
| 差异备份(Differential) | 基于最近一次完全备份的差异 | 不锁 InnoDB |
| 流备份(Stream Backup) | 备份并通过管道输出(如 .xbstream) | 不锁 |
| 备份压缩 | 使用 qpress/zstd | 不锁 |
xtrabackup --backup \
--target-dir=/data/backup/full_2025_01_01
xtrabackup --backup \
--target-dir=/backup/inc1 \
--incremental-basedir=/backup/full_2025_01_01
必须执行 prepare 才能恢复。
xtrabackup --prepare \
--target-dir=/backup/full_2025_01_01
反复 prepare 合并增量:
xtrabackup --prepare \
--target-dir=/backup/full_2025_01_01 \
--incremental-dir=/backup/inc1
systemctl stop mysql
rsync -avP /backup/full_2025_01_01/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql/
systemctl start mysql
Backup Stage:
- 拷贝数据文件
- 拷贝 redo
- 生成 xtrabackup_logfile(保证一致性)
Prepare Stage:
- 回放 redo
- 清理未提交事务
- 生成 crash-consistent 数据包
prepare 过程是 XtraBackup 的核心。
xtrabackup --backup --compress --target-dir=/backup/full
每天做:
xtrabackup --backup --incremental --incremental-basedir=/backup/full --target-dir=/backup/inc1
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
rsync -avP /backup/full/ /var/lib/mysql/
- 使用 SSD(极大提升)
- 增大 –parallel=4/8/16
- 使用 –compress + zstd(压缩极快)
- 使用 –encrypt(需要安全性时)
示例:
xtrabackup --backup --parallel=8 --compress --compress-threads=8
-
prepare 时增加并行度:
--prepare --parallel=8 -
恢复时使用 rsync 替代 cp
| 工具 | 类型 | 速度 | 一致性 | 锁表 | 恢复速度 |
|---|---|---|---|---|---|
| XtraBackup | 物理 | 极快 | 高 | 无锁(InnoDB) | 极快 |
| mysqldump | 逻辑 | 慢 | 需加锁 | 锁表 | 慢 |
| mydumper | 逻辑多线程 | 中等~快 | 可快照 | 无锁 | 中等 |
结论:
- 大型数据库(>50GB) -> XtraBackup
- 中小规模,需迁移到不同版本 -> mydumper
- 仅导数据结构或小数据 -> mysqldump
XtraBackup 与 MySQL版本强相关:
| MySQL 版本 | XtraBackup 版本 |
|---|---|
| MySQL 8.x | Percona XtraBackup 8.x |
| MySQL 5.7 | XtraBackup 2.4 |
不能混用。
xtrabackup --backup --encrypt=AES256 --encrypt-key=mykey
- prepare 会回放 redo
- prepare 失败 = 备份无效(非常关键)
链太长 prepare 时间巨大
- 自动备份
- 自动 prepare
- 自动推送到对象存储(OSS/OBS/S3)
- 自动校验
备份不演练 = 等于没有备份
完整恢复策略:
全备 -> 增量 -> binlog replay(point-in-time)
- XtraBackup 是 MySQL 的热备神器
- 支持完整、增量、流式备份
- prepare 才能让备份可恢复
- 恢复极快
- MySQL 8 需使用 Percona XtraBackup 8
- 大型数据库强烈推荐 XtraBackup + binlog 的方案
- 企业必须搭配自动化脚本与定期恢复演练