【问题标题】:Reasons for "DUPLICATE KEY" errors?“DUPLICATE KEY”错误的原因?
【发布时间】:2011-12-28 13:10:42
【问题描述】:

MySQL 复制中出现“DUPLICATE KEY”错误的原因是什么?

我正在设置主-主复制。假设有两个master,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的bug?

【问题讨论】:

  • 您的 AUTO_INCREMENT 设置是否正确以进行复制? ... 有问题的表的 CREATE TABLE 命令是什么?

标签: mysql


【解决方案1】:

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

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

  2. 因此通常会慢很多

  3. 当他们失败时,他们会表现得非常出色

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

您的问题似乎已经出现,因为您允许在多个节点上插入,并且正在为节点使用不带 setting the increment and offset 的自动增量字段。

【讨论】:

  • 不,我总是只在一个节点上插入行。但是,我仍然面临这个问题。
【解决方案2】:

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

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

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

【讨论】:

  • 我认为您并没有解决手头的实际问题,而是下意识地对唯一键通常的作用进行了非常笼统的描述。
  • 是的,我了解表中现有的唯一索引值会导致重复键错误。我很想知道为什么会首先出现 UNIQUE 密钥冲突。在我上面的示例中,在 master1 上插入的顺序是 Row1 和 Row2,但在我的复制实例中,插入的顺序是 Row2 后跟 Row1。为什么会这样?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2017-06-29
    • 2021-02-06
    • 1970-01-01
    • 2014-10-18
    • 2012-10-05
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多