MySQL复制冲突通常出现在主从架构中,尤其是使用基于语句的复制(SBR)或混合模式时。当从库执行来自主库的二进制日志事件失败,就会导致SQL线程停止,表现为复制中断。以下是常见的排查和解决方法。
检查复制状态
首先要确认复制是否真的出错以及错误类型:
SHOW SLAVE STATUS\G:查看关键字段,重点关注以下内容: Slave_IO_Running:是否正常拉取主库binlog Slave_SQL_Running:是否能正常应用SQL Last_Errno 和 Last_Error:显示最近的错误码和错误信息,如1062(主键冲突)、1032(记录不存在)等常见冲突类型及处理方式
根据错误码判断具体问题,并采取对应措施:
主键冲突(Error 1062):表示插入的记录在从库已存在 可能原因:手动在从库插入了与主库相同主键的数据 解决方法:跳过该事务(SET GLOBAL sql_slave_skip_counter=1; START SLAVE;),或删除从库重复数据后重启复制 记录不存在(Error 1032):UPDATE或DELETE操作找不到目标行 常见于从库数据缺失或误删 可通过mysqlbinlog解析主库binlog,查看原始SQL,确认缺失记录内容 补全从库数据,或跳过该事件
使用GTID避免部分冲突
启用GTID(全局事务标识)可提升复制一致性,简化故障恢复:
配置gtid_mode=ON、
enforce_gtid_consistency=ON发生冲突时,可通过
SET GTID_NEXT跳过特定事务,再重置为AUTOMATIC GTID环境下可使用
mysql.gtid_executed表追踪已执行事务
预防和优化建议
减少复制冲突的关键在于规范操作和合理配置:
避免在从库执行写操作,除非明确设计为可写从库 使用基于行的复制(RBR)替代SBR,减少因函数或非确定性语句引发的不一致 定期校验主从数据一致性,可用pt-table-checksum工具 监控复制延迟和错误日志,及时发现问题
基本上就这些。关键是通过
SHOW SLAVE STATUS定位错误,结合错误码分析原因,再选择跳过、修复或重建从库。合理配置复制模式和开启GTID能大幅降低冲突概率。
