我有一个包含大约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创建的临时表上获得错误来创建索引.