MySQL > 表不存在。但它确实存在(或应该存在)

296
我更改了MySQL安装的datadir,所有的数据库都正确地移动了,但有一个数据库没有。 我可以连接并使用该数据库。 SHOW TABLES也可以正确返回所有表格,并且每个表格的文件都存在于MySQL数据目录中。
但是,当我尝试从表格中选择内容时,我收到一个错误消息,指出该表格不存在。 然而,这是没有意义的,因为我能够通过SHOW TABLES语句显示相同的表格。
我的猜测是,SHOW TABLES列出文件存在,但不检查文件是否损坏。 因此,我可以列出这些文件,但无法访问它们。
尽管如此,这只是一个猜测。 我以前从未见过这种情况。 现在,我无法重新启动数据库进行测试,但使用它的其他应用程序都运行良好。
有人知道为什么会发生这种情况吗?
示例:
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist

只是复制了文件!是的,我拥有对所有内容的根访问权限。 - johnsmith
4
这些是InnoDB表吗? - Paul Dixon
1
是的,所有的表都是InnoDB。我的错,我没有说清楚! - johnsmith
最好将SQL导出并在新数据库上导入。 - DavidTaubmann
将来请查看日志文件,以便共享相关行。可能在您的系统中,您会看到类似于“[警告] InnoDB:加载表foo.bar失败,该表缺少外键索引。”这样的内容,就像其中一个答案中所看到的那样。我在这个旧问题中写下这条消息,因为评论中还没有人说查看日志文件是一个好习惯。谢谢! - Valerio Bozz
显示剩余8条评论
34个回答

1
以下内容对我很有帮助,感谢Alexey Vazhnov的评论。我运行了以下代码:
SET FOREIGN_KEY_CHECKS=0;
SHOW CREATE TABLE <tableName>;
SET FOREIGN_KEY_CHECKS=1;

它成功恢复了我的损坏表格<tableName>


1
我正准备删除一个数据库并重新创建它,这个技巧救了我! - peterpeterson
同样!谁会想到! - reformed

0
如果表名中有句号,以下查询语句将会失败: SELECT * FROM poorly_named.table; 使用反引号可以让查询语句找到该表: SELECT * FROM `poorly_named.table`;

0
在我的情况下,我没有进行datadir重定位或任何文件操作就出现了这种情况。它只是在一个美好的早晨发生了。
由于奇怪的是,尽管MySQL有时会抱怨“表不存在”,但我仍然能够使用mysqldump转储表。我通过转储表的模式+数据,然后DROP掉该表,并立即重新CREATE它,最后再进行导入来解决这个问题。

0

我遇到了相同的问题,但不是由于隐藏字符或“Schrödinger's table”引起的。该问题(与上述完全相同)出现在还原过程之后。我正在使用MySQL管理员版本1.2.16。当必须执行还原操作时,您必须取消选中目标模式中的ORIGINAL,并从下拉框中选择您的数据库名称。之后问题就解决了。至少在我的数据库中是这样的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接