不安全;仅当从库数据损坏、SQL线程报错停住且无法通过跳过错误或重放relay log恢复时,才考虑用mysqldump全量重建,否则可能扩大延迟或引发主库锁表。

主从位点不一致时,mysqldump 初始化是否安全?
不是所有位点不一致都适合用 mysqldump 重做——仅当从库数据已损坏、SQL线程报错停住、且无法通过跳过错误或重放 relay log 恢复时,才考虑全量重建。若只是 Seconds_Behind_Master 波动但 SQL 线程正常运行,别动;盲目 dump 可能扩大延迟甚至引发主库锁表。
执行 mysqldump 前必须确认的 4 个关键点
漏掉任一条件,dump 出来的备份无法用于可靠同步:
-
mysqldump --single-transaction要求主库引擎为 InnoDB,MyISAM 表会隐式加全局读锁 - 主库必须开启
binlog_format = ROW(STATEMENT 或 MIXED 下部分 DML 不可被从库精确重放) - dump 过程中不能有长事务在运行,否则
--single-transaction无法保证一致性快照 - 务必用
--master-data=2(而非 1),它把CHANGE MASTER TO所需的 binlog 文件名和位置写成注释,方便后续提取
从 dump 文件提取位点并执行 CHANGE MASTER TO 的实操细节
别直接搜 CHANGE MASTER ——mysqldump 输出里它只是注释,且格式不兼容 MySQL 8.0+ 的 GTID 模式。正确做法是:
- 用
grep 'CHANGE MASTER' backup.sql | head -1提取注释行(如:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=154;) - 手动去掉开头的
--和末尾分号,再补上MASTER_HOST、MASTER_USER等必要参数 - 如果主库启用了 GTID(
gtid_mode = ON),必须改用SET GLOBAL gtid_purged = 'xxx-xxx-xxx:1-123';+CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1;,此时MASTER_LOG_FILE/POS无效 - 执行
CHANGE MASTER TO前,先STOP SLAVE;,避免旧 IO 线程干扰
恢复后验证同步状态的最小检查清单
导入完成、启动复制后,光看 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 不够:
- 查
SHOW SLAVE STATUS\G中的Exec_Master_Log_Pos是否持续增长(非卡死) - 对比主库
SHOW MASTER STATUS的Position和从库的Read_Master_Log_Pos,差值应稳定在几 KB 内(网络延迟导致) - 在主库执行
INSERT INTO test_sync VALUES (UNIX_TIMESTAMP());,10 秒后查从库该值是否一致 - 注意
Retrieved_Gtid_Set和Executed_Gtid_Set在 GTID 模式下必须完全相等,否则说明有事务被跳过或未执行
位点修复最易忽略的是 binlog 格式与存储引擎的隐式耦合,以及 GTID 模式下 gtid_purged 的手动设置——这两处出错,从库看起来在跑,实际早已不同步。


















