MySQL复制中出现重复键错误的原因是什么?
我正在进行主-主复制设置。假设有两个母版,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以修复复制。
为什么总是出现重复键错误?对此有什么解决方案吗?是mysql的bug吗?
发布于 2011-12-28 23:05:03
mysql中的复制不会尝试在数据库中的所有节点上保持一致的状态。有一些集群解决方案试图做到这一点,但通常(IME):
基本上,您应该始终假设每个节点上的DML操作之间存在不可预测的延迟。
看起来您的问题已经出现了,因为您允许在多个节点上插入,并且为节点适当地使用了不带setting the increment and offset的自动增量字段。
发布于 2011-12-28 21:47:19
重复表中现有唯一索引或主键值的行会导致重复键错误
如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。例如,在不使用IGNORE的情况下,重复表中现有唯一索引或主键值的行将导致重复键错误,并且语句将中止。如果使用IGNORE,仍然不会插入行,但不会发出错误。
参考http://dev.mysql.com/doc/refman/5.5/en/insert.html
发布于 2012-01-04 20:47:40
也许是因为这个bug:http://bugs.mysql.com/bug.php?id=61209
检查服务器上的auto_increment_offset和innodb_autoinc_lock_mode的值是什么,并尝试使用auto_increment_offset = 1的服务器。
这是我为这个bug打的补丁,但它仍在等待MySQL/Oracle的响应。
https://stackoverflow.com/questions/8656314
复制相似问题