上一次尝试在MySql上中断后无法创建FULLTEXT索引

我有一个包含大约500万条目的InnoDB表.

昨天我尝试在其中一个列上创建一个FULLTEXT索引,但不幸的是,连接在进程的几分钟内被中断,因此实际上没有创建索引.

问题是,当我尝试通过此命令再次创建上述索引时:

CREATE FULLTEXT INDEX TEXT_FULL ON MY_BIG_TABLE(TEXT_COLUMN);

它给了我以下错误:

ERROR 1050 (42S01): Table 'my_db/#sql-ib131' already exists

起初我认为它只是一个名为“#sql-ib131”的临时表MySql为了完成我以前的索引请求而创建的,因此我尝试使用以下命令将其删除:

drop table `#sql-ib131`;

但是MySql返回以下内容:

ERROR 1051 (42S02): Unknown table 'my_db.#sql-ib131'

(我也尝试删除“sql-ib131”和“my_db /#sql-ib131”,但没有运气.

注意:我跑的时候:

SHOW INDEX FROM MY_BIG_TABLE;

输出中未提及FULLTEXT索引.

我如何克服这种行为并创建所需的索引?

谢谢,
筑港.

最佳答案 看来,当您中断尝试创建索引时,InnoDB无法完全清理.因此,它在数据字典中有一个条目,表示磁盘上实际不存在的表.

这也在这里报道:http://bugs.mysql.com/bug.php?id=71819

InnoDB维护内存中内部数据字典中的表的元数据.这将存储有关以前使用过的每个InnoDB表的信息.如果关闭mysqld,内存中的数据字典将被销毁,并在重新启动mysqld后使用表时重新填充.

由InnoDB创建的临时表(在#sql-ibXXX之后用图案表示)是物理创建的,但是立即取消链接.

但是如果发生了某些事情,例如你的连接突然中止,InnoDB可能无法正常清理.

您应该可以通过重新启动mysqld来清除数据字典.

另一种可能发生这种奇怪悖论的情况是使用VIEW,因为视图不是表,但视图名称与表名冲突.

mysql> CREATE VIEW test.V AS SELECT * FROM test.Foo;

mysql> DROP TABLE test.V;
ERROR 1051 (42S02): Unknown table 'test.V'

mysql> CREATE TABLE test.V (i INT);
ERROR 1050 (42S01): Table 'V' already exists

但这不是你的情况,因为你明显地在一个ALTER TABLE期间隐式地在InnoDB创建的临时表上获得错误来创建索引.

点赞