在mysql主从复制架构中,主库把数据变更记录到binlog,从库通过io线程拉取binlog并写入relay log,再由sql线程回放。实际运维里经常发现从库数据和主库不一致,理解mysql主从不同步的原因有助于及时排查故障。

常见的mysql主从不同步原因
1. 网络与连接问题
主从之间网络抖动、中断,或者防火墙阻断了复制端口,会导致从库io线程无法持续拉取binlog。网络恢复后若未正确重启复制,就会停留在旧位置。
2. 主库或从库异常停机
主库意外宕机可能造成最后一个事务未完全刷盘;从库宕机则可能使relay log损坏。这类情况会让复制位点错乱,从而产生不同步。
3. 从库被直接写入数据
如果从库允许业务程序执行insert或update,就会和回放的主库日志冲突,出现主键重复或数据覆盖,破坏主从一致。
4. binlog或复制配置不一致
主库binlog_format设为statement,但某些函数如uuid()在从库回放结果不同;或者server_id重复,都会导致同步异常。
5. sql线程执行报错
例如从库缺少主库存在的表、字段类型不兼容、磁盘写满等,sql线程会停止并报错,此时需要用show slave status查看具体信息。
如何查看同步状态
在从库执行如下命令可观察复制运行情况:
-- 查看从库复制状态 SHOW SLAVE STATUSG -- 重点关注以下字段 -- Slave_IO_Running: 是否为 Yes -- Slave_SQL_Running: 是否为 Yes -- Last_Error: 最近一次 sql 线程错误 -- Seconds_Behind_Master: 主从延迟秒数
简单修复示例
如果是位点错误且数据量小,可跳过冲突事务后重启复制:
-- 停止从库复制 STOP SLAVE; -- 跳过下一个错误事务(仅测试或紧急使用) SET GLOBAL sql_slave_skip_counter = 1; -- 重新启动复制 START SLAVE;
预防建议
- 从库开启read_only,避免人为写入
- 统一主从mysql版本与核心参数
- 监控Slave_SQL_Running与延迟指标
- 定期校验主从数据一致性,如使用pt-table-checksum
明确mysql主从不同步的原因并配合规范运维,可以大幅降低主从数据问题的发生频率。