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 命令查看同步状态,确认同步是否恢复正常.
在从库上手动改写了记录,并将主键改为了与主库相同的值.在这种情况下,可以通过删除从库上的冲突记录解决主从同步问题.
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 项的内容,进一步定位问题并解决.