今天线上出现了数据更新后在手机终端无法获取最新数据的问题。
仔细查看了一下,刚开始认为是ActiveMQ消息队列阻塞导致无法及时更新缓存(原来出现过1次)。
可手工删除redis中对应的key后还是无法重新reload数据,这才意识到是主从同步出了问题。
原来是某应用曾经连错mysql并向slave中新写入了几条数据,后来改为连master,并把写入slave的数据重新写入master表里。导致主从key自增主键不一致使主从同步失效。
简单记录一下解决办法:
1、用root账号登陆slave,执行show slave status;
此处打印出A表同步时insert错误信息(主键冲突)。
2、删除slave机A表中新写入的数据。
3、停止slave:stop slave
4、设置同步时忽略1步错误:set global sql_slave_skip_counter = 1;
5、重启slave:start slave; 再次查看show slave status,无异常信息。
6、连master,先将A表导出为sql脚本。删除A表新写入的数据,将sql脚本中删掉的数据修改为slave没有使用过的id,执行sql重新insert到master的A表.
7、连slave查看A表,发现master中写入的数据已同步,问题解决。
注:
查看当前表自增主键使用情况:show create table A
其中AUTO_INCREMENT表示当前表下一个将使用的主键值。
参考资料:
哪些原因会导致mysql主从数据不一致:http://www.dewen.org/q/670