Назад | Перейти на главную страницу

Почему происходит сбой репликации с ошибкой Повторяющаяся запись для ключа?

Мы реплицируем уже год или два без особых проблем. Иногда мы получаем ошибочный SQL-запрос, который останавливает репликацию, и мы используем следующие команды, чтобы снова запустить его:

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
SHOW SLAVE STATUS \G;

Обычно это нормально, однако сегодня мы начали получать ошибки при попытке реплицировать базу данных (FYI Invision Power Board):

               Last_SQL_Error: Error 'Duplicate entry 'forums-pid-994' for key '
app'' on query. Default database: 'forum_db'. Query: 'INSERT INTO ibf_rep
utation_cache (`app`,`type`,`type_id`,`rep_like_cache`) VALUES('forums','pid',99
4,'a:2:{s:10:\"cache_data\";a:0:{}s:12:\"cache_expire\";i:1326339370;}') ON DUPL
ICATE KEY UPDATE app=VALUES(app),type=VALUES(type),type_id=VALUES(type_id),rep_l
ike_cache=VALUES(rep_like_cache)'

Есть много подобных запросов, которые, кажется, являются частью программного обеспечения Invision Power Board, поэтому избавляться от него - не лучший вариант. Странно то, что когда я запускаю этот точный запрос на том же сервере MySQL, он проходит без проблем.

Примечание: Вчера мы обновили MySQL 5.1.36 до MySQL 5.5.16, так что это почти наверняка связано. Он находится на сервере Windows.

Вот расположение стола:

mysql> DESC forum_db.ibf_reputation_cache;
+----------------+---------------------+------+-----+---------+----------------+

| Field          | Type                | Null | Key | Default | Extra          |

+----------------+---------------------+------+-----+---------+----------------+

| id             | bigint(10) unsigned | NO   | PRI | NULL    | auto_increment |

| app            | varchar(32)         | NO   | MUL | NULL    |                |

| type           | varchar(32)         | NO   | MUL | NULL    |                |

| type_id        | int(10) unsigned    | NO   |     | NULL    |                |

| rep_points     | int(10)             | NO   |     | 0       |                |

| rep_like_cache | mediumtext          | YES  |     | NULL    |                |

+----------------+---------------------+------+-----+---------+----------------+

6 rows in set (0.12 sec)

Начнем с сообщения об ошибке:

               Last_SQL_Error: Error 'Duplicate entry 'forums-pid-994' for key '
app'' on query. Default database: 'forum_db'. Query: 'INSERT INTO ibf_rep
utation_cache (`app`,`type`,`type_id`,`rep_like_cache`) VALUES('forums','pid',99
4,'a:2:{s:10:\"cache_data\";a:0:{}s:12:\"cache_expire\";i:1326339370;}') ON DUPL
ICATE KEY UPDATE app=VALUES(app),type=VALUES(type),type_id=VALUES(type_id),rep_l
ike_cache=VALUES(rep_like_cache)'

Репликация жалуясь на индекс, называемый app. Очевидно, у вас есть УНИКАЛЬНЫЙ индекс для этого столбца. Также обратите внимание на запрос ON DUPLICATE KEY пункт. У тебя есть app=VALUES(app). Этот столбец нельзя заменить в ON DUPLICATE KEY по двум причинам:

  1. это тот же столбец, который вызвал ON DUPLICATE KEY действие
  2. это бесполезно повлияет на индекс app если действие было разрешено

Рекомендация: вам следует удалить app=VALUES(app) из ON DUPLICATE KEY пункт.

Возможно, предыдущие версии MySQL просто игнорировали недопустимые столбцы в ON DUPLICATE KEY пункт, и последняя версия, которую вы сейчас используете, больше осведомлена об этой проблеме.