踩坑过程
昨天在开发电脑上搭建了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的主从配置
重新开启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
持续更新中…