问题: 项目中数据库使用的主从同步,报表查询使用的从数据库数据,测试人员发现项目中报表近两天天数据为空,经排查,发现从mysql主从挂掉了,数据没有同步过来.
问题原因: 从库执行主库事务时报错.
错误如下:
Last_Error: Could not execute Delete_rows event on table iam.analysis_app_tb;Can’t find record in ‘analysis_app_tb’,Error_code: 1032;handler error HA_ERR_KEY_NOT_FOUND;the event’s master log mysql-bin.000036,end_log_pos 1043243243
解决办法:
1,登录mysql从库,查询主从同步状态;
>show slave status\G;
结果显示Slave_SQL_Running: No,说明主从挂掉了;
2,停止slave服务
> stop slave;
3,设置跳过相关错误
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
4,开启slave服务
>start slave;
5,如果还有报错,重复步骤2-4;
解决思路:
可选方案如下:
一、查看Master最新的Position,将其作为Slave复制的起点。
这种思路体现的是过去的不一致既往不咎,现在保持同步即可。看起来,这个思路和恢复主从库数据的一致性的初衷有所违背,但这种方法,简单,高效,在测试环境,对历史数据要求不高的场景中可使用。
二、必须严格的恢复主从库数据的一致性。
在这里,也有两种思路:
- 备份主库数据,并在从库上恢复,在历史数据一致性的基础上开启同步,但这种方法比较麻烦,必须在主库上执行锁表操作,阻止客户端对于表数据的更新操作,而且在数据量大的情况下,备份也是个耗时的工程。其实,这种方法在实际生产环境中也很少用。
- Skip掉相关错误
其实,这个说活不是很严谨,准备的说,是跳过相关的事务。在我今天这种情况下,就是skip掉因违反主键约束而失败的insert语句。
参考博客: https://m.xp.cn/b.php/112646.html