xtrabackup是TB级MySQL在线热迁移最可靠选择,因其为InnoDB-aware物理备份,直接拷贝ibd/redo日志,不走SQL解析,全程几乎无锁、QPS影响小;而mysqldump为逻辑导出,600G+耗时超8小时且易触发FTWRL或长事务阻塞,业务写入卡死。

TB级MySQL在线热迁移,xtrabackup是目前最可靠的选择;mysqldump和mydumper在600G+场景下基本不可用,纯物理拷贝又极易破坏一致性。
为什么必须用xtrabackup而不是mysqldump
mysqldump是逻辑导出,全程走SQL解析+文本生成,600G库导出可能耗时8小时以上,且会触发FTWRL(全局读锁)或长事务阻塞,业务写入直接卡住。而xtrabackup是InnoDB-aware的物理备份,直接拷贝ibd、redo日志和元数据,不经过SQL层,备份过程对业务QPS影响极小。
- 备份阶段:xtrabackup只在最后几秒加轻量级锁获取binlog位点,其余时间完全无锁
- 恢复阶段:prepare阶段可并行回滚未提交事务,
xtrabackup --apply-log --parallel=4能显著缩短时间 - 流式传输:用
--stream=xbstream配合ssh或nc直传目标机,避免本地磁盘中转 - 压缩节省带宽:
--compress --compress-threads=2可在备份时实时压缩,实测降低40%传输体积
xtrabackup全量备份+主从拉起的关键参数
不是所有参数组合都能支撑TB级热迁移——漏掉任何一个,都可能在prepare或start slave阶段报错。
- 备份命令必须包含
--no-lock(仅适用于InnoDB表),否则遇到MyISAM表会强制锁表 - 必须加
--slave-info,它会把SHOW SLAVE STATUS输出写入xtrabackup_slave_info,后续CHANGE MASTER TO才可自动取位点 - 务必启用
--safe-slave-backup,它会在备份前暂停SQL线程,避免备份期间从库应用中断导致位点漂移 - 目标机恢复前,先清空
datadir,再用xtrabackup --copy-back(不能用--move-back,否则权限丢失) - 恢复后启动前,必须执行
chown -R mysql:mysql /var/lib/mysql,否则mysqld拒绝启动
常见失败现象及对应排查点
实战中最容易卡在三个地方:prepare失败、启动失败、start slave报错1236。
-
innobackupex: Error: The system tablespace file is missing→ 检查是否误删了ibdata1,xtrabackup全量备份默认不备份共享表空间,但恢复时需要它存在(哪怕为空) - mysqld启动报
Table 'mysql.plugin' doesn't exist→ 说明没备份系统库,或--include参数过滤过严;TB级迁移应完整备份,不要加--databases限定 -
Got fatal error 1236 from master when reading data from binary log→ 查xtrabackup_binlog_info里的文件名是否存在,以及主库SHOW BINARY LOGS是否已轮滚掉该文件;若已删除,需提前开启expire_logs_days并保留足够天数 - 从库同步延迟飙升 → 检查
innodb_buffer_pool_size是否与主库一致,新实例若配置过小,会导致大量磁盘IO,拖慢SQL线程
迁移窗口内必须完成的收尾动作
备份+恢复只是基础,真正决定能否“4小时内切走”的,是最后15分钟的操作节奏。
- 切换前10分钟,执行
STOP SLAVE; SHOW SLAVE STATUS\G,确认Seconds_Behind_Master = 0且Master_Host指向正确主库 - 停业务后,立刻在主库执行
FLUSH TABLES WITH READ LOCK,记下SHOW MASTER STATUS输出的精确位点 - 从库执行
CHANGE MASTER TO MASTER_LOG_FILE='xxx', MASTER_LOG_POS=yyy,然后START SLAVE - 验证:在从库
SELECT COUNT(*)比对关键大表,用pt-table-checksum做行级校验(别省这步) - 切流量前,确认
read_only=ON已在从库生效,防止误写
最容易被忽略的是lower_case_table_names参数——旧环境是Linux(区分大小写),新环境若误配为0,会导致表找不到;必须在my.cnf里显式设为1,并在初始化实例前就配置好。


















