85°

记一次mysql主从同步失败的踩坑记录

踩坑过程

  昨天在开发电脑上搭建了mysql的主从服务,并尝试搞了一下读写分离的实现机制。想着今天再来搞一下数据分表。于是一大早来了后就开始搞起来。可是当测试的时候却发现,从库的数据怎么都写不进去,检查了好久,还以为新搞得的分表配置逻辑有问题。咦~没问题啊,是不是数据库的同步的问题啊?于是带着疑问我尝试了一下手动在master里添加一个数据,然后到slave库里查看一下有没有。果然,没有,那就真的是主从同步除了问题。忽然想到,今早来了后我把电脑重启了一下,再加上昨天有部分配置是通过命令生效的,没有写进配置文件。 于是果断cmd查了一下slave的slave状态

...
Slave_IO_Running: No
Slave_SQL_Running: No
...

哈哈,果然。 查了一下master的status

>mysql>show master status;
   File和position都有变化
   于是重新配置了一下slave,配置步骤可以参考昨天的文章[windows上mysql的主从配置](https://my.oschina.net/qrainly/blog/3072368 "windows上mysql的主从配置")
   重新开启slave
>mysql>start slave
   查看slave状态
>mysql>show slave status\G;

报错如下

Last_SQL_Error: Could not execute Delete_rows event on table user; 
Can't find record in 'user',
Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; 
the event's master log mysql-bin.000003, end_log_pos 1651

  看着报错像是想删除去找不到,哦哦,忘了自己在搞这个过程中,在主库加了数据删了又加,一定是binlog记录同步到slave,执行报的错。于是打算重新再搞一次slave,把position重置到master现在的位置。

  终于一番操作,搞定。

问题总结

最后我又查了查百度,发现我这个问题其实有更简单的办法,就属于下面常见问题的第一种

问题一:

1、在master上删除一条记录,而slave上找不到

解决办法:

通过命令直接跳过同步

mysql>stop slave;
mysql>set global sql_slave_skip_counter=1;
mysql>start slave;

问题二:

2、slave已经有该主键的记录,又在master上插入了一条主键相同多的记录。

报错示例:

Last_SQL_Error: Could not execute Write_rows event on table user; 
Duplicate entry '2' for key 'PRIMARY', 
Error_code: 1062; 
handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000003, end_log_pos 234

解决方案:

在slave上删除重复主键的数据

mysql>delete from user where id = 2;

问题三:

3、在master上更新一条记录,在slave上找不到该条数据。 报错示例:

Last_SQL_Error: Could not execute Update_rows event on table user; 
Can't find record in 'user', 
Error_code: 1032; 
handler error HA_ERR_KEY_NOT_FOUND; 
the event's master log mysql-bin.000003, end_log_pos 435

解决方案:

找到丢失的那条记录,从master上找出来insert到salve中,在重新开启slave

持续更新中...

本文由【qrainly】发布于开源中国,原文链接:https://my.oschina.net/qrainly/blog/3072795

全部评论: 0

    我有话说: