- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含大约 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/
我是一名优秀的程序员,十分优秀!