xtrabackup是最可靠的MySQL在线扩容从库手段,但需主库开启GTID且binlog_format=ROW,并在备份时指定--slave-info和--safe-slave-backup,恢复后必须手动SET GLOBAL gtid_purged,且验证Retrieved_Gtid_Set、Executed_Gtid_Set和Seconds_Behind_Master三项指标。

xtrabackup 是目前最可靠的 MySQL 在线扩容从库手段,前提是主库开启 GTID 且 binlog_format=ROW。它不锁主库、不依赖网络长连接、恢复快、一致性高——但**不是“一键完成”,中间有三处必须人工干预的节点,漏掉一个就会导致复制中断或数据错乱**。
为什么不能直接用 mysqldump 做从库扩容
逻辑备份在大库(>50 GB)场景下会拖慢主库:它要逐行读取、拼 SQL、加锁获取 binlog 位点,mysqldump --single-transaction 对高并发写入的主库仍可能触发长事务堆积,尤其当主库存在未提交事务时,SHOW PROCESSLIST 里会出现大量 Waiting for table flush。而 xtrabackup 备份的是物理页,全程只在最后几秒加轻量级全局读锁(FLUSH TABLES WITH READ LOCK),对主库影响几乎不可见。
备份阶段必须带 --slave-info 和 --gtid-mode=ON
这两个参数决定从库能否自动对接主库的 GTID 流水线:
-
--slave-info:让备份生成xtrabackup_slave_info文件,里面含CHANGE MASTER TO所需的MASTER_LOG_FILE和MASTER_LOG_POS(非 GTID 模式下必需) -
--gtid-mode=ON(或更准确地说,要求主库已启用 GTID,且备份命令中显式指定--safe-slave-backup):确保备份结束时刻的gtid_executed被完整记录进xtrabackup_binlog_info - 漏掉
--slave-info→ 恢复后无法自动构造CHANGE MASTER TO语句;漏掉 GTID 上下文 → 从库启动后报错Cannot replicate because the master has GTID_MODE = ON and this server has GTID_MODE = OFF
恢复后必须手动设置 gtid_purged 才能 START SLAVE
这是最容易翻车的环节。xtrabackup 恢复后的实例,gtid_executed 为空,gtid_purged 也为空——但它其实已经包含了备份那一刻的所有事务。你必须从备份目录里把 GTID 集合提取出来,再 SET 进去:
先查看备份信息:cat /backup/xtrabackup_binlog_info
输出类似:mysql-bin.000042 123456 abcdef01-2345-6789-abcd-ef0123456789:1-2345, fedcba98-7654-3210-dcba-9876543210fe:1-678
然后在从库 MySQL 中执行:SET GLOBAL gtid_purged = 'abcdef01-2345-6789-abcd-ef0123456789:1-2345, fedcba98-7654-3210-dcba-9876543210fe:1-678';
⚠️ 注意:
• 必须在 RESET MASTER 之后、START SLAVE 之前执行
• gtid_purged 只能设一次,设完再改会报错 Variable 'gtid_purged' is a read-only variable
• 如果从库之前运行过,务必先 STOP SLAVE; RESET SLAVE ALL; 清空旧状态
验证复制状态时重点看三项指标
执行 SHOW SLAVE STATUS\G 后,别只扫一眼 Slave_IO_Running 和 Slave_SQL_Running 是否为 Yes:
-
Retrieved_Gtid_Set:应与主库当前SELECT @@global.gtid_executed;的前缀一致(允许略少,表示还在追) -
Executed_Gtid_Set:应逐步增长,且不能出现跳号或回退 -
Seconds_Behind_Master:首次启动后可能短暂飙升,但应持续下降;若卡在某个值不动,大概率是主库 binlog 被清理了,从库找不到对应日志 —— 此时要检查主库expire_logs_days或binlog_expire_logs_seconds
GTID 模式下,Master_Host 和 Master_User 看似无关紧要,但一旦填错,START SLAVE 会静默失败,SHOW SLAVE STATUS 里连错误号都不显示 —— 这个细节常被忽略。











