根本原因是xtrabackup 2.4.x不支持mysql 8.0+默认的caching_sha2_password认证插件;应升级至percona-xtrabackup-80或临时改用mysql_native_password。

为什么 xtrabackup 备份时提示 Failed to connect to MySQL server
根本原因不是权限或网络,而是 xtrabackup 默认用 --user=root --password= 连,但 MySQL 8.0+ 默认 root 用 caching_sha2_password 插件,而老版本 xtrabackup(如 2.4.x)不支持该认证方式。
- 检查 MySQL 认证插件:
SELECT user, host, plugin FROM mysql.user WHERE user='root'; - 临时解决:把 root 切回
mysql_native_password(仅测试环境):ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 生产推荐:升级到
percona-xtrabackup-80(对应 MySQL 8.0+),它原生支持caching_sha2_password - 连接参数别硬写密码,用
--defaults-file=/etc/my.cnf或--login-path更安全
备份命令里 --backup 和 --prepare 能不能合并执行
不能。这是两个严格分离的阶段,强行跳过 --prepare 直接恢复,99% 概率启动失败或数据损坏。
-
--backup是拷贝物理文件(ibdata1、.ibd等),过程不停库,但数据页可能不一致(有未刷盘事务) -
--prepare是重放 redo log + 回滚未提交事务,让备份变成“一致性快照”,这步必须离线做,且需足够磁盘空间(会生成临时日志文件) - 常见错误:备份完立刻
cp -r到新实例并启动 —— MySQL 启动时报InnoDB: Page [page id: space=0, page number=5] log sequence number 123456789 is in the future! - 正确流程:
xtrabackup --backup --target-dir=/backup/20240401/→xtrabackup --prepare --target-dir=/backup/20240401/→ 再复制到目标 datadir
增量备份怎么配,--incremental-basedir 指的是哪个目录
--incremental-basedir 必须指向**上一次成功 prepare 完的全量或增量备份目录**,不是原始 backup 目录,也不是 MySQL datadir。
- 全量备份:
xtrabackup --backup --target-dir=/backup/full/→xtrabackup --prepare --target-dir=/backup/full/ - 第一次增量:
xtrabackup --backup --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 --backup --incremental-basedir=/backup/inc1/ --target-dir=/backup/inc2/ - 关键点:
--apply-log-only在中间增量合并时必须加,否则最后一次 prepare 会把 undo 清掉,导致无法再应用后续增量
恢复时 innodb_log_file_size 不匹配报错怎么办
恢复前务必确认目标 MySQL 实例的 innodb_log_file_size 和备份时一致,否则启动直接失败,报错类似 InnoDB: Error: log file ./ib_logfile0 is of different size。
- 查源库配置:
SELECT @@innodb_log_file_size;或看my.cnf中innodb_log_file_size值(单位字节) - 恢复前删掉目标实例的
ib_logfile0、ib_logfile1(MySQL 关闭状态下操作) - 确保
my.cnf里innodb_log_file_size和源库一致,再启动 MySQL - 如果源库是动态调大过该值(比如从 48M → 128M),备份时实际用的是新大小,但
xtrabackup不自动记录这个变更 —— 所以必须人工核对











