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

当前回答

在复制idb-file之前,尝试使用sql查询来丢弃表空间:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制idb-file

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重新启动MySql

其他回答

在我的例子中是SQLCA。DBParm参数。

我使用

SQLCA.DBParm = "Databse = "sle_database.text""

但它必须是

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

解释:

你将组合三个字符串:

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

不要在四元符号中使用空格。 感谢我的同事Jan。

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

在我的例子中,我没有做datadir重定位或任何类型的文件操作。这件事发生在一个晴朗的早晨。

因为,奇怪的是,我能够转储表,使用mysqldump,尽管MySQL有时会抱怨“表不存在”,我解决它通过转储表的模式+数据,然后drop表,然后重新创建它之后立即,然后导入。

对我来说,在Mac OS (MySQL DMG安装),一个简单的重启MySQL服务器解决了这个问题。我猜是冬眠造成的。

当我使用的表名的大小写关闭时,我就会遇到这个问题。所以表被称为'db'但我在select语句中使用'db'。确保箱子是一样的。