我更改了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

当前回答

以防还有人关心:

在直接使用命令复制数据库目录后,我也遇到了同样的问题

cp -r /path/to/my/database /var/lib/mysql/new_database

如果你在一个使用InnoDB表的数据库中这样做,你会得到这个疯狂的“table does not exist”错误。

问题是你需要MySQL datadir根目录下的ib*文件(例如ibdata1, ib_logfile0和ib_logfile1)。

当我复制它们时,它对我有用。

其他回答

当将lower_case_table_names设置为1,然后试图访问使用该变量的默认值创建的表时,也会发生此错误。在这种情况下,您可以将其恢复到以前的值,您将能够读取表。

它可能有一个隐藏字符在你的表名。当你做表的时候,这些是不会显示出来的。你可以做一个“SHOW CREATE TABLE TABLE_ONE”和tab完成“TABLE_ONE”,看看它是否放入了任何隐藏字符。还有,你有没有试过把桌子掉下来重新做。只是为了确保特权没有问题,并且没有隐藏字符。

如果表名中有句点,它将失败 SELECT * FROM poorly_name .table;

使用反勾号让它找到表 SELECT * FROM ' poorly_name .table ';

好吧,这听起来很荒谬,但请迁就我。 对我来说,当我把我的陈述改为这样时,问题就解决了:

SELECT * FROM `table`

我做了两个改动 1)。使表名小写-我知道!! 2)。使用特定的引号符号= ':它是标签上方的键

这个解决方案听起来很荒谬,但它很有效,而且现在是周六晚上,我从早上9点就开始工作了-所以我接受了:)

祝你好运。

转到:xampp\mysql\data\dbname 在dbname中有tablename.frm和tablename.frm。ibd文件。删除它 并重新启动mysql,再试一次。