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

标签 mysql indexing full-text-search innodb temporary

我有一个包含大约 500 万个条目的 InnoDB 表。 昨天我试图在它的其中一个列上创建全文索引,但不幸的是连接在这个过程中中断了几分钟,因此实际上没有创建索引。

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

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 ,因为 View 不是表,但 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 创建的临时表上收到错误。

关于mysql - 上一次尝试在 MySql 上中断后无法创建 FULLTEXT 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277766/

相关文章:

regex - 让用户输入自定义正则表达式模式是否安全?

php - 针对表行的全文搜索

mysql - 选择结果集到变量中,然后在同一存储过程的更新中使用该变量

php - UTF-8贯穿始终

python - 在python中反转句子

mysql - 索引 MySQL 数据库的 TEXT 列是正确的方法吗?

mysql - 在 MySQL 中进行全文搜索的最有效方法

php - Wordpress 对两个表的自定义查询以获取分层数据

php - 我只想显示日期为空的数据

python - Pandas 按名称索引和访问列