2011-12-28 3 views
2

В чем причина ошибок «DUPLICATE KEY» в репликации 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') 

Итак, я обновляя row2 идентификатор в Master2 исправить репликацию.

Почему ошибки DUPLICATE KEY постоянно происходят постоянно? Есть ли какие-либо решения? Это ошибка mysql?

+0

Правильно ли настроен ваш AUTO_INCREMENT для репликации?... что представляют собой команды CREATE TABLE для рассматриваемой таблицы? – BRFennPocock

ответ

0

Строка, дублирует существующий уникальный индекс или значение первичного ключа в таблице вызывает дубликат ключа ошибки

При использовании IGNORE ключевого слова, ошибки, возникающие при выполнении оператора INSERT рассматриваются как предупреждения вместо этого. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка все еще не вставлена, но ошибка не выдана.

См http://dev.mysql.com/doc/refman/5.5/en/insert.html

+0

Я не думаю, что вы обратились к фактической проблеме, а не коленое дребезжание в очень общее описание того, что обычно делают обычные ключи. –

+0

Да, я понимаю, что существующее значение индекса UNIQUE в таблице вызывает ошибку с повторяющимся ключом. Мне интересно узнать, почему в первую очередь возникает УНИКАЛЬНЫЙ ключевой конфликт. В моем примере выше, на master1, порядок вставки - это строки Row1 и Row2, но в моем экземпляре репликации порядок вставки - Row2, за которым следует Row1. Почему это происходит? –

2

репликации в MySQL не пытается поддерживать согласованное состояние всех узлов в базе данных. Есть кластерные решения, которые пытаются это сделать, но в целом (IME):

  1. требует огромных объемов данных, синхронизации, передаваемых между узлами

  2. часто гораздо медленнее, в результате

  3. когда они терпят неудачу, они делают это резко

В принципе, вы всегда должны предполагать, что будет непредсказуемый дель между операциями DML на каждом узле.

Похоже, ваша проблема возникла из-за того, что вы разрешаете вставки на нескольких узлах и используете поля с автоматическим приращением без setting the increment and offset соответственно для узлов.

+0

Нет, я всегда вставляю строки только на одном узле все время. Но я все еще сталкиваюсь с этим вопросом. –

0

Может быть, это из-за этой ошибки: http://bugs.mysql.com/bug.php?id=61209

Проверьте, что значения для auto_increment_offset и innodb_autoinc_lock_mode на своих серверах и попытаться использовать сервер с auto_increment_offset = 1.

Там мой патч для этой ошибки, но он все еще ждет ответа от MySQL/Oracle.