xtrabackup 2.4.29 是 MySQL 5.7 无锁备份唯一可用版本,需授权 REPLICATION CLIENT 等权限、必须执行 --prepare 才能恢复,且恢复前须清空并 chown /var/lib/mysql。

xtrabackup 是 MySQL 5.7 实现真正无锁备份的唯一实用选择,但“无锁”不等于“零影响”——它只对 InnoDB 表做到不阻塞 DML,DDL、MyISAM 表、元数据锁仍可能触发短暂锁等待。必须用 xtrabackup 2.4 系列(如 2.4.29),其他版本会直接失败。
为什么不能用 xtrabackup 8.0 或 2.3 备份 MySQL 5.7
MySQL 5.7 的 redo log 格式与 8.0 不兼容,xtrabackup --version 输出不含 2.4. 字样就说明版本错:
– 用 xtrabackup 8.0 会报错 Unsupported MySQL version
– 用 xtrabackup 2.3 可能跳过 5.7 新增的 undo tablespace 处理逻辑,导致恢复后 InnoDB: Database page corruption
– CentOS 8 安装命令必须是 yum localinstall percona-xtrabackup-24-2.4.29-1.el8.x86_64.rpm,不能依赖默认 repo
备份用户权限缺 REPLICATION CLIENT 就会静默失效
xtrabackup 需要读取 SHOW MASTER STATUS 获取 binlog 位置,否则 --slave-info 和 --master-data=2 参数完全不生效,但不会报错:
– 必须显式授权:GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'
– 不推荐用 root,避免权限过度暴露
– 密码建议通过 --defaults-extra-file 传入,避免出现在 ps aux 或 bash history 中
– 文件权限必须设为 600,否则 xtrabackup 拒绝读取
不执行 --prepare 就恢复 = 启动失败
全量备份只是文件拷贝,InnoDB 数据页处于“中间状态”,必须回放 redo log 才能一致:
– 备份命令:xtrabackup --backup --target-dir=/data/backup/full_$(date +%F) --user=bkpuser --password='xxx' --datadir=/var/lib/mysql
– 关键后续步骤:xtrabackup --prepare --target-dir=/data/backup/full_2026-06-18
– 跳过这步直接 --copy-back,MySQL 启动时大概率报 InnoDB: Trying to access page number xxx in space xxx
– 增量备份也必须先 --prepare 全量,再合并增量,最后再整体 --prepare
恢复时清空目录和 chown 属主是硬性前提
恢复不是复制粘贴,而是重建可启动的数据目录:
– 必须先 systemctl stop mysqld,不能带服务运行恢复
– 必须 rm -rf /var/lib/mysql/*(注意是清空内容,不是删目录本身)
– 执行 xtrabackup --copy-back --target-dir=/data/backup/full_2026-06-18
– 必须 chown -R mysql:mysql /var/lib/mysql,否则启动报 Can't open the mysql.plugin table 或权限拒绝
– /var/lib/mysql 目录本身属主可以是 root,但其下所有文件必须是 mysql:mysql
实际线上最常被跳过的环节是 --prepare 和 chown,这两个动作缺失会导致整个备份不可用,而错误日志里往往只显示模糊的 InnoDB 初始化失败。备份脚本里建议把 --prepare 结果校验加进去:检查输出末尾是否含 completed OK!,否则中止后续流程。


















