MySQL复制中出现“DUPLICATE KEY”错误的原因是什么?
我正在进行主 - 主复制设置。假设有两个主设备master1和master2,数据始终插入master1 我使用的查询是“INSERT INTO temp(temp_column2,temp_column3,...)VALUES('XXX','YYY',...)”,其中temp_column1是auto_increment列。 在我的设置中,两个守护进程将数据插入master1,并且它正在创建重复的键错误。
我无法弄清楚为什么会这样。大多数情况下,当问题发生时,重复键错误是行与下一行之间的冲突。
例如:
#### on master1 ####
temp_column1, temp_column2, temp_column3, timestamp
Row1: 1 'XXX', 'YYY', 2011-12-28 12:00:00
Row2: 3 'AAA', 'BBB', 2011-12-28 12:00:00
#### on master2 (replication mysql instance) ####
temp_column1, temp_column2, temp_column3, timestamp
Row1: 1 'AAA', 'BBB', 2011-12-28 12:00:00
Row2: (Duplicate key error) when trying to insert row1 ('XXX', 'YYY')
所以,我正在更新master2中的Row2 id以修复复制。
为什么DUPLICATE KEY错误总会持续发生?这有什么解决方案吗?这是一个mysql错误吗?
答案 0 :(得分:2)
mysql中的复制不会尝试在数据库中的所有节点上保持一致状态。有一些集群解决方案试图这样做但通常(IME):
需要在节点之间传递大量同步数据
通常会慢得多
当他们失败时,他们就会这么做了
基本上,您应该始终假设每个节点上的DML操作之间会有不可预测的延迟。
看起来您的问题已经出现,因为您允许在多个节点上进行插入,并且正在为节点使用没有setting the increment and offset的自动增量字段。
答案 1 :(得分:0)
复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误
如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。
答案 2 :(得分:0)
也许是因为这个错误: http://bugs.mysql.com/bug.php?id=61209
检查服务器上auto_increment_offset和innodb_autoinc_lock_mode的值,并尝试使用auto_increment_offset = 1的服务器。
我有这个bug的补丁,但它仍在等待MySQL / Oracle的任何响应。