“DUPLICATE KEY”错误的原因?

时间:2011-12-28 13:10:43

标签: mysql

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错误吗?

3 个答案:

答案 0 :(得分:2)

mysql中的复制不会尝试在数据库中的所有节点上保持一致状态。有一些集群解决方案试图这样做但通常(IME):

  1. 需要在节点之间传递大量同步数据

  2. 通常会慢得多

  3. 当他们失败时,他们就会这么做了

  4. 基本上,您应该始终假设每个节点上的DML操作之间会有不可预测的延迟。

    看起来您的问题已经出现,因为您允许在多个节点上进行插入,并且正在为节点使用没有setting the increment and offset的自动增量字段。

答案 1 :(得分:0)

复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误

如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。

参考http://dev.mysql.com/doc/refman/5.5/en/insert.html

答案 2 :(得分:0)

也许是因为这个错误: http://bugs.mysql.com/bug.php?id=61209

检查服务器上auto_increment_offset和innodb_autoinc_lock_mode的值,并尝试使用auto_increment_offset = 1的服务器。

我有这个bug的补丁,但它仍在等待MySQL / Oracle的任何响应。