MySQL 5.6 错误 "InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED" 是什么意思?

What does the MySQL 5.6 error "InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED" mean?

在 MySQL 5.6.22(特别是在 Amazon RDS 上 运行)我曾经在 table 上有一个全文索引。从那以后,我放弃了该索引,转而使用 sphinxsearch。数据库中的任何 table 都没有更多的全文索引。

当我现在尝试执行在线 DDL,例如将 tinyint 列添加到带有 LOCK=NONE 的 table 时,我收到此错误:

InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED.

但是,任何地方都没有全文索引。我什至尝试在 Amazon 中创建一个只读副本,希望重建数据库能够解决这个问题,但我在那里遇到了同样的错误。

我是不是遗漏了什么明显的东西?

显示创建 TABLE:

CREATE TABLE `pages` (
  `ID` char(64) CHARACTER SET latin1 NOT NULL,
  `auto_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `siteID` bigint(20) unsigned NOT NULL,
  `recordingID` char(64) DEFAULT NULL,
  `dateCreated` datetime DEFAULT NULL,
  `ip` char(46) CHARACTER SET latin1 DEFAULT NULL,
  `referrer` text CHARACTER SET latin1,
  `referrer_client` char(50) DEFAULT NULL,
  `referrer_from` char(255) DEFAULT NULL,
  `referrer_type` char(50) DEFAULT NULL,
  `referrer_network` char(50) DEFAULT NULL,
  `referrer_link` char(255) DEFAULT NULL,
  `campaign_source` char(50) DEFAULT NULL,
  `campaign_medium` char(32) DEFAULT NULL,
  `campaign_campaign` char(75) DEFAULT NULL,
  `url` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `keywords` char(100) CHARACTER SET latin1 DEFAULT NULL,
  `source` char(128) CHARACTER SET latin1 DEFAULT NULL,
  `os` char(30) CHARACTER SET latin1 DEFAULT NULL,
  `browser` char(30) CHARACTER SET latin1 DEFAULT NULL,
  `user_agent` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `agentFamily` char(50) DEFAULT NULL,
  `is_phone` tinyint(1) DEFAULT '0',
  `is_tablet` tinyint(1) DEFAULT '0',
  `is_desktop` tinyint(1) DEFAULT '0',
  `tags` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `device` char(65) DEFAULT NULL,
  `last_event_time` datetime DEFAULT NULL,
  `view_width` int(11) DEFAULT NULL,
  `view_height` int(11) DEFAULT NULL,
  `browser_width` int(11) DEFAULT NULL,
  `browser_height` int(11) DEFAULT NULL,
  `optimizely_experiments` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `optimizely_variations` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `is_paid` tinyint(1) DEFAULT '0',
  `typed` tinyint(1) DEFAULT '0',
  `organization` char(255) CHARACTER SET latin1 DEFAULT NULL,
  `country` char(75) CHARACTER SET latin1 DEFAULT NULL,
  `city` char(128) CHARACTER SET latin1 DEFAULT NULL,
  `region` char(10) DEFAULT NULL,
  `regionName` char(64) DEFAULT NULL,
  `country_code2` char(2) CHARACTER SET latin1 DEFAULT NULL,
  `postal` char(32) CHARACTER SET latin1 DEFAULT NULL,
  `latitude` char(30) DEFAULT NULL,
  `longitude` char(30) DEFAULT NULL,
  `custom_data` text CHARACTER SET latin1,
  `notes` text CHARACTER SET latin1,
  `title` char(255) DEFAULT NULL,
  `has_dom_tree` tinyint(1) DEFAULT '0',
  `time` int(11) DEFAULT NULL,
  PRIMARY KEY (`auto_id`),
  UNIQUE KEY `pageid` (`ID`),
  KEY `siteID` (`siteID`),
  KEY `dateCreated` (`dateCreated`),
  KEY `recordingID` (`recordingID`),
  KEY `siteID_url` (`siteID`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=90042803 DEFAULT CHARSET=utf8

简单改变

ALTER TABLE `pages`   
  ADD COLUMN `is_ppc` TINYINT(1) , LOCK=NONE

错误

Error Code: 1846
LOCK=NONE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try LOCK=SHARED.

没有修复。两种解决方法包括:

  1. 重建table,或
  2. LOCK = SHARED

--都不符合"no locks".

的条件

我建议在 MySQL bug tracker 提交一份报告。与此同时,这里有一个对我来说也失败的测试用例:

drop table IF EXISTS so28666643a;
CREATE TABLE so28666643a (ai INT AUTO_INCREMENT PRIMARY KEY,
    txt TEXT NOT NULL ) ENGINE=InnoDB;
ALTER TABLE so28666643a ADD COLUMN x TINYINT, LOCK=NONE;  -- works OK

drop table so28666643a;
CREATE TABLE so28666643a (ai INT AUTO_INCREMENT PRIMARY KEY,
    txt TEXT NOT NULL ) ENGINE=InnoDB; -- same
ALTER TABLE so28666643a ADD FULLTEXT(txt);
ALTER TABLE so28666643a DROP INDEX txt;
ALTER TABLE so28666643a ADD COLUMN x TINYINT, LOCK=NONE;  -- fails with strange message:

ERROR 1846 (0A000): LOCK=NONE is not supported.
Reason: InnoDB presently supports one FULLTEXT index creation at a time.
Try LOCK=SHARED.

编辑:感谢 bug report

找到更好的解决方法(解决方案),

我将 table 引擎从 InnoDB 更改为 MyISAM

ALTER TABLE `tablename` ENGINE='MyISAM';

然后我 运行 alter table 添加 fulltext 列索引:

ALTER TABLE `tablename` ADD FULLTEXT `asset_number` (`asset_number`);

之后,我将 table 引擎改回 InnoDB

ALTER TABLE `tablename` ENGINE='InnoDB';

这是我所做的, 在我的例子中,我在 table 中有 5 个全文索引。我想 运行 对 table.

中的几个列进行 ALTER 查询

首先, 从 table.

中删除全文索引

其次, 运行 您的 ALTER 查询。

第三, 只需重新添加全文索引即可。

示例:

/*FIRST QUERY*/
DROP INDEX fulltext_index1 ON table_name;
DROP INDEX fulltext_index2 ON table_name;

/*SECOND QUERY*/
ALTER TABLE table_name 
 CHANGE `price` `price` DECIMAL(10,2) DEFAULT 0.00  NOT NULL;

/*THIRD QUERY*/
ALTER TABLE table_name ADD FULLTEXT fulltext_index1(column_name1);
ALTER TABLE table_name ADD FULLTEXT fulltext_index2(column_name2);

这样一来,您就不必删除列或做任何额外的工作来保留数据。 但请记住,这只是每个 table 的一次性工作。在我的例子中,我从来不需要删除索引并将其重新添加回 table。此后,ALTER 查询 运行ning 没有错误。