全量备份必须用 xtrabackup --backup,不可与--prepare混淆;流程严格分三步:备份→准备→恢复;--backup是唯一写入阶段,需mysql运行、写权限和足够磁盘空间。

全量备份必须用 xtrabackup --backup,不能用 --prepare 混淆阶段
很多人第一次跑脚本就失败,是因为把备份和准备(apply log)当成一步操作。实际流程严格分三步:备份 → 准备 → 恢复。全量备份命令必须带 --backup 且指定 --target-dir,否则生成的目录不可用于恢复。
常见错误现象:xtrabackup: error: no 'xtrabackup_checkpoints' file found,本质是没执行 --backup 就直接去 --prepare。
-
--backup是唯一写入数据的阶段,必须有写权限、足够磁盘空间,且 MySQL 实例必须运行(InnoDB 热备依赖 active redo log) -
--prepare是只读操作,可离线执行,作用是把备份目录里的未提交事务回滚、已提交事务前滚,产出一致的可用快照 - 全量备份建议加
--no-timestamp避免自动生成时间戳子目录,便于脚本统一管理路径
增量备份依赖上一次备份的 xtrabackup_checkpoints,不是“上次时间”
增量备份不是按时间差算的,而是基于上一次备份(全量或上一个增量)产生的 xtrabackup_checkpoints 文件里的 to_lsn 值。XtraBackup 会从该 LSN 开始拷贝后续变更的页。
使用场景:每天一次全量 + 每小时一次增量,恢复时必须按“全量 → 增量1 → 增量2…”顺序依次 --prepare,中间不能跳过。
- 第一次增量备份命令必须指定
--incremental-basedir=/path/to/full-backup,指向全量目录 - 第二次增量要指向上一次增量目录(不是全量),即
--incremental-basedir=/path/to/inc1 - 误用
--incremental-basedir指向错误目录会导致LSN mismatch错误,备份无效 - 增量备份不校验上一级是否存在,只读取 checkpoint 文件,所以脚本里必须先检查
xtrabackup_checkpoints是否可读
备份脚本必须显式处理 innobackupex 已弃用问题
MySQL 8.0+ 官方推荐直接用 xtrabackup 二进制,innobackupex 在 Percona XtraBackup 8.0 中已被移除。但很多老脚本还在调用它,运行直接报 command not found。
安装时注意:Percona XtraBackup 8.0+ 只兼容 MySQL 8.0/Percona Server 8.0;若用 MySQL 5.7,必须装 XtraBackup 2.4(对应包名 percona-xtrabackup-24)。
- 检查版本:
xtrabackup --version输出含8.0.表示不支持 MySQL 5.7 - CentOS 7 安装 XtraBackup 2.4:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm && yum install percona-xtrabackup-24 - 脚本中所有
innobackupex替换为xtrabackup,参数基本兼容,但--defaults-file必须放在最前面,否则被忽略
备份后校验不能只靠文件存在,必须运行 xtrabackup --check-privileges 和 --stats
备份成功 ≠ 备份可用。经常遇到备份目录看着完整,恢复时卡在 Applying a partial backup 或提示表空间损坏。原因常是备份过程中权限不足、redo log 被覆盖、或 mysqld 突然重启。
真正有效的校验是模拟准备阶段的关键动作:
- 执行
xtrabackup --check-privileges --target-dir=/backup/path,确认用户对备份目录有读写权、对 MySQL socket 有连接权 - 快速验证备份完整性:
xtrabackup --stats --target-dir=/backup/path 2>/dev/null | grep -E "(Total\ pages|LSN)",应输出非零页数和合理 LSN 范围 - 不要跳过
--prepare测试:用--prepare --apply-log-only(全量)或加--incremental-dir(增量)跑一次轻量准备,看是否报错 - 备份脚本末尾建议追加一句
ls -l /backup/path/xtrabackup_checkpoints,人工抽查 LSN 连续性
xtrabackup_checkpoints 文件被覆盖、LSN 跳变、或某次增量因磁盘满静默失败。脚本里每一步都要有 || exit 1 和明确的错误日志输出位置,别依赖“看起来没报错”。











