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 的方案
- 企业必须搭配自动化脚本与定期恢复演练
Percona XtraBackup (PXB) 是用于 MySQL 的开源物理热备工具,支持全量与增量备份。
全量备份流程包括:备份数据文件 (–backup)、准备数据 (–prepare) 以确保一致性、恢复数据 (–copy-back),最后调整权限并重启服务。
全量备份将数据库所有文件复制到指定目录。
-
执行备份命令:
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backups/full_base --user=root --password=your_password--backup: 执行备份模式。--target-dir: 备份文件存储目录。
-
验证备份:查看备份目录下的
xtrabackup_checkpoints文件,确保最后一行显示backup_type = full-backuped。
备份完成后,数据文件不一致,需要应用 Redo Log 使数据达到一致性状态,此步骤必须在恢复前执行。
xtrabackup --prepare --target-dir=/data/backups/full_base
--prepare: 对备份数据进行准备。此操作会应用 redo 日志并回滚未提交的事务。
将准备好的一致性数据文件复制回 MySQL 数据目录。
-
停止 MySQL 服务
systemctl stop mysqld -
清空数据目录
确保数据目录 datadir 为空(通常是 /var/lib/mysql)。
rm -rf /var/lib/mysql/* -
恢复数据
xtrabackup --copy-back --target-dir=/data/backups/full_base--copy-back: 将备份文件从备份目录复制回 MySQL 的数据目录。
-
修改权限与重启
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