MySQL 5.7 必须使用 percona-xtrabackup-24(如 2.4.29),禁用 8.0 或 2.3 版本;需创建含 REPLICATION CLIENT 等权限的专用用户,全量备份后必须执行 --prepare 预处理,恢复时清空数据目录并 chown 属主为 mysql:mysql。

必须用 xtrabackup 2.4.x,不能用 8.0 或 2.3 —— 否则备份看似成功,恢复时直接报 Unsupported MySQL version 或静默损坏。
确认 MySQL 和 xtrabackup 版本是否匹配
MySQL 5.7 只能搭配 percona-xtrabackup-24(如 2.4.29),这是硬性限制,不是建议。
- 查 MySQL 版本:
mysql --version(应输出类似mysql Ver 14.14 Distrib 5.7.44) - 查 xtrabackup 版本:
xtrabackup --version(输出里必须含2.4.,不含8.0或2.3) - RPM 包名必须是
percona-xtrabackup-24-*.rpm;Ubuntu 上必须用apt install percona-xtrabackup-24 - CentOS 7/8 安装后务必补依赖:
perl-DBD-MySQL、perl-Digest-MD5、libev,缺一就会卡在Can't locate DBI.pm
创建最小权限专用用户,别用 root
xtrabackup 不需要超级权限,但漏掉任意一项关键权限会导致备份不一致或参数失效(比如 --slave-info 静默不写 binlog 位点)。
- 执行 SQL 创建用户:
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'StrongPass123!';<br>GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';<br>FLUSH PRIVILEGES;
-
REPLICATION CLIENT是必须的——没有它,SHOW MASTER STATUS拿不到,主从信息就丢;LOCK TABLES在备份 MyISAM 表时会用到(哪怕你全用 InnoDB,也得留着) - 密码不要写在命令行里,推荐放
/root/.my.cnf:[client]<br>user=bkpuser<br>password=StrongPass123!<br>host=127.0.0.1
全量备份命令必须带关键参数,且 --target-dir 要清空
只写 xtrabackup --backup --target-dir=/backup/full 一定失败——它默认不连数据库,也不读 datadir。
- 完整命令示例:
xtrabackup --backup \<br>--target-dir=/backup/full_$(date +%F_%H-%M) \<br>--user=bkpuser \<br>--datadir=/var/lib/mysql \<br>--no-timestamp
-
--datadir必须显式指定,不能靠配置文件自动推断;如果 MySQL 用了非默认socket(比如/tmp/mysql.sock),还得加--socket=/tmp/mysql.sock -
--target-dir目录必须为空,且运行xtrabackup的用户要有写权限(常见坑:目录是root创建的,但用普通用户跑命令) -
--no-timestamp建议加上,否则生成/backup/2026-09-03_09-03-22/这种难脚本管理的路径
--prepare 不是可选项,是恢复前强制步骤
备份完的目录只是“原始拷贝”,InnoDB redo log 还没回放,直接 --copy-back 启动 MySQL 会报 InnoDB: Database page corruption。
- 执行预处理:
xtrabackup --prepare --target-dir=/backup/full_2026-09-03_09-03-22 - 这个过程会回放 redo log、回滚未提交事务,让数据达到一致性状态;耗时取决于备份期间的写入量,可能几分钟到十几分钟
- 如果中途中断,再次运行
--prepare会报错,必须从头来(所以别在磁盘快满时做) - 注意:
--prepare不改原备份目录结构,也不需要停库;但后续--copy-back前必须停库,并清空/var/lib/mysql/*(不是只删子目录)
最容易被跳过的其实是属主修复:chown -R mysql:mysql /var/lib/mysql。MySQL 启动时校验文件属主,不匹配就卡在 Can't open the mysql.plugin table,连错误日志都写不全。


















