主键的 MySQL 复制重复条目

Rav*_*avi 4 mysql replication mysql-5.5

160523 13:07:29 [ERROR] Slave SQL: Error 'Duplicate entry '914166' for key
'PRIMARY'' on query. Default database: 'zo_dev_20121216'. Query: 'UPDATE    
   activity
SET
   activity_type_id = 9,
   subject = 'Send departure email',
   date_due = '2016-05-26 01:00',
   date_start = '2016-05-23 01:00',
   activity_status_id = 1,
   content = 'Send departure email'
WHERE
   id = 2888555', Error_code: 1062
160523 13:07:29 [Warning] Slave: Duplicate entry '914166' for key 'PRIMARY'     
Error_code: 1062
160523 13:07:29 [ERROR] Error running query, slave SQL thread aborted. Fix     
the problem, and restart the slave SQL thread with "SLAVE START". We stopped   
at log 'mysql-bin.000004' position 14847360
Run Code Online (Sandbox Code Playgroud)

许多人建议使用 slave-skip-error 选项等。但这将完全避免查询。您实际上如何继续引发错误的查询?另外,我找不到一个好的答案来说明为什么会发生这种情况以及数字“914166”表示什么?有人可以解释一下吗?

Rat*_*r B 7

数字 914166 表示什么?

该数字表示您尝试插入数据的表行。例如,您正在尝试向第 914166 行插入一些值。

为什么会出现这个错误?

由于重复值而发生此错误。您正在尝试将914166activity作为主键插入/更新,但该表活动中已存在值 914166。

您实际上如何继续引发错误的查询?

您不能继续该查询,因为主键列是唯一列,它不接受重复值。您可以使用以下语句跳过此查询并继续下一个查询:

stop slave;

set global sql_slave_skip_counter = 1;

start slave;
Run Code Online (Sandbox Code Playgroud)

请注意,跳过错误不是一个好的选择,您应该尝试修复问题并按照 MySQL 的建议启动从站。

解决:

提到的查询是完整的语句吗?

似乎给定的查询不是插入查询,而是更新语句,它没有更新活动表的主键。

检查主服务器,提到的主键(id)列是否属于activity表,并检查该(id=914166)列中是否存在该值。

select * from zo_dev_20121216.activity where id = 914166;
Run Code Online (Sandbox Code Playgroud)

如果该活动表中存在该值,则在从服务器中检查该特定值(id=914166)是否存在,如果该值存在于从服务器中,则可以简单地跳过查询。

select * from zo_dev_20121216.activity where id = 914166;
Run Code Online (Sandbox Code Playgroud)

如果以上 2 个查询的结果集为空,则可以确定,查询不完整,或者您正在调试错误的查询。

关键是,查询试图将一个值插入/更新到该表中已经存在的活动表中

我希望它可以帮助您作为调试错误的起点。

  • 它不是第 914166 行,而是以 914166 作为主键值的行。 (2认同)