为什么复制失败,错误重复input密钥?

我们一直在复制一两年,没有什么问题。 有时候我们会得到一个错误的SQL查询来停止复制,我们使用下面的命令重新开始:

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

这通常很好,但是今天我们开始在尝试复制(FYI Invision电源板)数据库时出现错误:

  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电源板软件的一部分,所以摆脱它是不是一个select。 奇怪的是,当我在同一个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的索引。 很显然,你在这个列上有一个UNIQUE索引。 另外,请注意查询的ON DUPLICATE KEY子句。 你有app=VALUES(app) 。 由于以下两个原因,无法在ON DUPLICATE KEY更换此列:

  1. 它是触发ON DUPLICATE KEY操作的同一列
  2. 如果行动被允许,它将不必要地影响索引app

build议:您应该从ON DUPLICATE KEY子句中删除app=VALUES(app)

以前的MySQL版本可能会忽略ON DUPLICATE KEY子句中违规的列,而现在使用的最新版本更能意识到这个问题。