能重建,但必须用物理备份(xtrabackup)+ xtrabackup_binlog_info 中的位点,跳过已丢失的 binlog;mysqldump 不记录 binlog 坐标,无法精准设置 change master to,导致主从永远追不上。

直接说结论:能重建,但必须用物理备份(XtraBackup)+ xtrabackup_binlog_info 中的位点,跳过已丢失的 binlog,否则主从永远追不上。
为什么不能只用 mysqldump 恢复从库
逻辑备份恢复后,SHOW SLAVE STATUS 里 Master_Log_File 和 Read_Master_Log_Pos 是空的,你得手动找 binlog 起始位置——而这个位置在 mysqldump 输出里根本没记录。更麻烦的是,mysqldump --single-transaction 只保证事务一致性,不记录 binlog 坐标,你没法精准设置 CHANGE MASTER TO 的 MASTER_LOG_FILE 和 MASTER_LOG_POS。
常见错误现象:Seconds_Behind_Master: NULL、Slave_IO_Running: No、报错 Could not find first log file name in binary log index file。
-
mysqldump适合开发/测试环境重建,或主库彻底不可用时的兜底方案 - 生产从库重建必须依赖物理备份中自带的
xtrabackup_binlog_info文件 - 如果主库 binlog 已被自动清理(比如保留 7 天,断连 30 天),那只能全量重建,别指望增量追平
用 XtraBackup 恢复从库的关键三步
核心不是“把文件拷过去”,而是让新实例知道“我该从主库哪个 binlog 文件、哪个 position 开始拉日志”。这个信息只存在于 xtrabackup_binlog_info 里,且只在 --prepare 后才真正可用。
实操顺序不能错:
- 先在主库执行
innobackupex --user=root --password=xxx /backup/(推荐加--parallel=4 --throttle=300) - 在从库解压后,**必须**运行
xtrabackup --prepare --target-dir=/backup/2026-09-01_12-00-00/(注意是xtrabackup,不是innobackupex,新版已弃用后者) - 检查
/backup/2026-09-01_12-00-00/xtrabackup_binlog_info,内容类似mysql-bin.000042 19832456,这就是你要的MASTER_LOG_FILE和MASTER_LOG_POS
恢复后启动复制前最容易漏的两件事
很多人卡在 START SLAVE 后立刻报错 1594 或 1062,其实不是数据问题,而是配置没清干净。
- 删掉从库
datadir下残留的master.info和relay-log.info(XtraBackup 不会覆盖它们,但旧文件里的位点会干扰新复制) - 确认从库
my.cnf里没有read_only=0或skip_slave_start这类冲突配置;server-id必须和主库不同,且不能为 1(主库常用 1,从库建议设为 2、3 等) - 执行
CHANGE MASTER TO时,MASTER_HOST填主库真实 IP(不是localhost),MASTER_USER必须有REPLICATION SLAVE权限,密码不能带特殊字符(如@、#),否则解析失败
最后提醒一句:xtrabackup --prepare 这一步耗时最长,尤其是大库(100G+),它本质是在做崩溃恢复——回滚未提交事务、前滚已提交但未刷盘的数据。别看到卡住就 Ctrl+C,中断后整个备份目录就废了,得重来。











