Мы реплицируем уже год или два без особых проблем. Иногда мы получаем ошибочный 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
по двум причинам:
ON DUPLICATE KEY
действиеapp
если действие было разрешеноРекомендация: вам следует удалить app=VALUES(app)
из ON DUPLICATE KEY
пункт.
Возможно, предыдущие версии MySQL просто игнорировали недопустимые столбцы в ON DUPLICATE KEY
пункт, и последняя версия, которую вы сейчас используете, больше осведомлена об этой проблеме.