SQL主从复制通过将主库的变更日志同步到从库重放,实现从库数据与主库保持一致,是支撑高并发业务的重要基础。但在实际运行中,网络波动、主从配置差异、大事务执行等因素都可能导致复制异常,进而引发主从数据不一致。

SQL主从一致性的核心保障机制
要保障主从一致性,首先需要理解主从复制的核心流程,从机制层面减少异常出现的概率。
1. 复制流程规范
标准的主从复制流程分为三个步骤:主库将变更写入binlog,从库的IO线程拉取binlog并写入本地relay log,从库的SQL线程重放relay log中的事件。三个步骤任何一个环节出现问题,都可能导致一致性受损。
2. 关键配置要求
- 主从库的server-id必须唯一,避免binlog事件识别混乱
- 主库开启gtid_mode和enforce_gtid_consistency,从库基于GTID同步,避免日志位点偏移导致的数据遗漏
- 主从库的基础字符集、排序规则、表结构必须保持一致,避免数据写入时出现编码错误
- 从库设置为只读模式,避免人为直接修改从库数据导致不一致
3. 一致性校验机制
定期使用专业工具校验主从数据一致性,比如MySQL的pt-table-checksum工具,能够按表对比主从数据差异,提前发现潜在的不一致问题。校验频率可以根据业务数据变更频率调整,高频变更的业务建议每天校验一次。
常见复制异常场景与排查步骤
当主从复制出现异常时,可以按照以下步骤逐步排查定位问题。
第一步:检查从库复制状态
首先登录从库执行以下命令查看复制运行状态:
SHOW SLAVE STATUSG
重点关注两个字段:Slave_IO_Running和Slave_SQL_Running,正常状态下两个值都应该是Yes。如果IO线程不是Yes,说明从库拉取主库binlog失败;如果SQL线程不是Yes,说明从库重放relay log失败。
第二步:根据异常类型定位问题
| 异常类型 | 常见原因 | 排查方向 |
|---|---|---|
| IO线程异常 | 主从网络不通、主库binlog被清理、主从账号权限不足 | 检查主从网络连通性、查看主库binlog保留策略、校验同步账号权限 |
| SQL线程异常 | 从库表结构与主库不一致、主库执行的操作从库无权限、大事务导致延迟过高 | 对比主从表结构、检查从库账号权限、查看从库当前执行的SQL语句 |
| 主从数据不一致但复制正常 | 从库被人为修改、主库执行了非确定性函数、复制过滤规则配置错误 | 排查从库操作日志、检查主库SQL是否包含UUID()等不确定函数、核对复制过滤规则 |
第三步:查看错误日志定位具体原因
如果从库复制状态显示有错误,可以查看从库的错误日志,或者查看SHOW SLAVE STATUS中的Last_SQL_Error字段,里面会记录具体的错误信息,比如缺少某个表、字段不存在、主键冲突等。
复制异常的修复方法
根据排查出的问题类型,选择对应的修复方案,修复过程中要注意数据安全,避免造成数据丢失。
1. IO线程异常修复
如果是主库binlog被清理导致IO线程无法拉取日志,需要重新搭建从库:先在主库导出全量数据,导入到从库,然后重新配置主从同步,指定正确的binlog位点和GTID集合。
如果是网络或权限问题,修复网络连通性、调整同步账号权限后,执行以下命令重启复制:
STOP SLAVE; START SLAVE;
2. SQL线程异常修复
如果是表结构不一致导致的错误,先同步主从表结构,比如主库新增了字段,在从库执行对应的ALTER TABLE语句,然后重启SQL线程。
如果是主键冲突等数据问题,且冲突数据不影响业务,可以跳过对应的错误事件:
STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
注意跳过错误仅适用于临时应急,跳过之后需要后续校验数据一致性,避免遗漏数据。
3. 主从数据不一致修复
如果校验发现主从存在数据差异,可以使用pt-table-sync工具修复,该工具会根据主库的数据,自动生成从库的数据修复语句,同步过程中不会中断主从复制。
修复前先执行以下命令预览修复内容,确认无误后再执行实际修复:
pt-table-sync --execute --replicate test.checksum h=主库IP,u=账号,p=密码 h=从库IP,u=账号,p=密码
修复完成后,再次执行一致性校验,确认主从数据完全一致。
预防复制异常的最佳实践
- 主库避免执行大事务,大事务会导致从库重放延迟过高,甚至引发复制中断
- 主库避免使用UUID()、SYSDATE()等非确定性函数,这类函数会导致主从执行结果不一致
- 从库不要配置复制过滤规则,除非明确需要过滤部分库的同步,过滤规则错误很容易导致数据缺失
- 定期监控主从延迟,当延迟超过阈值时及时告警,排查延迟原因
主从复制异常修复过程中,一定要先备份从库数据,避免修复操作导致数据进一步损坏,所有修复操作建议在业务低峰期执行。