下面就详细讲解“MySQL 5.6主从报错的实战记录”的完整攻略。
问题描述
在 MySQL 5.6 主从复制环境中,从库报错如下:
Error 'Duplicate entry '12345' for key 'PRIMARY'' on query...
问题分析
这个错误提示的含义是,由于从库上已经存在一条与主库上相同的记录,从而导致主从同步失败。查看数据库表的结构和数据,发现从库上的表确实存在主键相同的记录。这可能是由于以下原因导致的:
- 从库上手动改写了记录,并将主键改为了与主库相同的值。
- 从库上的同步线程发生了错误,导致主键冲突。
我们需要进一步分析错误日志,查找导致主从同步失败的具体原因。
解决方案
- 首先需要通过
show slave status\G
命令查看从库的同步状态,确认同步是否正常。
(...)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(...)
如果以上两个状态都为 Yes,则表示从库同步正常,在解决主从同步问题时需要考虑其他方面的问题。
- 如果同步状态正常,需要进一步查看错误日志,找到导致主从同步失败的具体 SQL 语句。
在从库上运行 show slave status\G
命令,查看 Last_Error
项的内容。
(...)
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '12345' for key 'PRIMARY'' on query...
(...)
可以看到,报错信息中包含了具体的 SQL 语句。根据这个 SQL 语句,可以确认是从库上手动修改记录导致的冲突。
- 解决主从同步问题的方法是,删除从库上的重复记录。在删除记录前,需要先停止同步线程,否则删除操作可能会在主库和从库上都执行,导致再次出现冲突。
停止同步线程的命令为:
stop slave;
然后,可以通过以下命令,在从库上删除重复记录:
delete from 表名 where 主键=12345;
删除完成后,重新启动同步线程:
start slave;
等待一段时间后,可以通过 show slave status\G
命令查看同步状态,确认同步是否恢复正常。
示例说明
示例一
在从库上手动改写了记录,并将主键改为了与主库相同的值。在这种情况下,可以通过删除从库上的冲突记录解决主从同步问题。
例如,从库上的表为 user
,主键为 id
,其中有一条记录的 id
值为 12345
,与主库中的 user
表中的记录重复。通过以下命令可以删除重复的记录:
stop slave;
delete from user where id=12345;
start slave;
示例二
从库上的同步线程发生了错误,导致主键冲突。在这种情况下,需要查找导致同步失败的具体原因,并解决问题。
例如,从库上的 Last_Error
项中包含的错误信息如下:
Last_Errno: 1213
Last_Error: Error 'Deadlock found when trying to get lock; try restarting transaction' on query...
这说明同步线程在执行 SQL 语句时发生了死锁,需要进一步分析原因并解决问题。可以通过查看 Last_SQL_Error
和 Last_IO_Error
项的内容,进一步定位问题并解决。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 5.6主从报错的实战记录 - Python技术站