我们一直在复制一两年,没有什么问题。 有时候我们会得到一个错误的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更换此列:
ON DUPLICATE KEY操作的同一列 app build议:您应该从ON DUPLICATE KEY子句中删除app=VALUES(app) 。
以前的MySQL版本可能会忽略ON DUPLICATE KEY子句中违规的列,而现在使用的最新版本更能意识到这个问题。