XtraBackup实现MySQL 5.7热备份必须严格匹配版本(仅限2.4.x)、创建含REPLICATION CLIENT等权限的专用用户、全量备份后执行--prepare预处理、恢复时清空目录并chown属主,否则备份不可用。

xtrabackup 能做热备份,但不是开箱即用就安全——必须确认版本匹配、权限到位、参数写对,否则备份出来的是不可恢复的“假备份”。
怎么装对版本?别用错 percona-xtrabackup-24 或 percona-xtrabackup-80
MySQL 5.7 用 percona-xtrabackup-24;MySQL 8.0+ 必须用 percona-xtrabackup-80(或更高,如 8.0.35)。混用会直接报错:Unsupported MySQL version 或静默失败。
- 查 MySQL 版本:
mysql --version - 查已装 xtrabackup 版本:
xtrabackup --version(输出里带8.0.x才支持 MySQL 8.0) - RPM 安装后记得装依赖:
perl-DBD-MySQL、perl-Digest-MD5、libev(CentOS 7+ 缺一不可,否则备份中途卡在Can't locate DBI.pm)
xtrabackup --backup 命令里哪些参数不能省?
光写 xtrabackup --backup --target-dir=/backup/full 是跑不通的——它默认不连数据库,也没权限读 datadir。
- 必须显式指定用户和密码:
--user=root --password=xxx(生产环境建议用最小权限账号,至少要有RELOAD、LOCK TABLES、REPLICATION CLIENT) -
--target-dir目录必须为空,且xtrabackup进程有写权限(常见坑:/backup是 root 创建,但运行命令的是普通用户) - 如果 MySQL 配置了
socket文件不在默认路径(/var/lib/mysql/mysql.sock),得加--socket=/path/to/mysql.sock - 想跳过时间戳子目录?加
--no-timestamp,否则每次备份都生成/backup/2026-08-11_12-34-56/这种难管理的路径
增量备份为什么总失败?--incremental-basedir 指错了
增量备份不是“比上次少备份点”,而是基于某个完整备份的 to_lsn 值做差量。错指 --incremental-basedir 就会导致 Invalid incremental backup: log sequence number。
- 先看全备目录里的
xtrabackup_checkpoints:to_lsn = 123456789 - 第一次增量必须指向这个全备目录:
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full - 第二次增量不能指回
/backup/full,得指向前一次增量目录:--incremental-basedir=/backup/inc1 - 所有增量备份目录也必须为空,且不能和全备同名(比如别叫
/backup/full/inc1,xtrabackup 会拒绝)
备份完不 --prepare 就恢复?数据一定损坏
刚备份出来的目录是“未提交状态”:InnoDB 数据页没应用 redo 日志,MyISAM 表可能锁着,ibdata1 和 .ibd 不一致。直接拷回去启动 MySQL 会报错:Tablespace is missing 或崩溃。
- 全备准备:
xtrabackup --prepare --target-dir=/backup/full(注意:这里不用--apply-log-only) - 增量应用到全备:
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1 - 最后一个增量之后,去掉
--apply-log-only再跑一次--prepare,才算真正可恢复 - 别漏掉
--copy-back步骤:它才是把文件复制回datadir的动作,而且要求目标目录为空、属主为mysql
真正麻烦的从来不是命令敲几行,而是 LSN 对不上、权限没放开、版本不兼容、日志没应用——这些地方一错,备份就等于没做。


















