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

当前回答

我花了三天时间在这个噩梦上。理想情况下,您应该有一个可以恢复的备份,然后只需删除损坏的表。这类错误可能导致ibdata1变大(一般表的大小为100GB以上)。

如果您没有最近的备份,例如如果您依赖mySqlDump,那么您的备份可能在过去的某个时候无声地崩溃了。您将需要导出数据库,当然您不能这样做,因为您将在运行mySqlDump时得到锁定错误。

因此,作为一种变通方法,转到/var/log/mysql/database_name/并删除table_name.*

然后立即尝试转储表;这样做现在应该可以工作了。现在将数据库恢复到一个新的数据库,并重新构建丢失的表。然后转储损坏的数据库。

在我们的例子中,我们还不断地在所有数据库上随机地得到mysql已经离开的消息;一旦损坏的数据库被删除,一切都恢复正常。

其他回答

下面是另一个场景(版本升级):

我重新安装了我的操作系统(Mac OS El Captain),并安装了一个新版本的mysql(使用自制软件)。安装的版本(5.7)恰好比我之前的版本更新。然后复制表,包括ib*文件,并重新启动服务器。我可以看到mysql工作台中的表,但当我尝试选择任何东西时,我得到“表不存在”。

解决方案:

停止mysql服务器,例如mysql。服务器停止或酿造服务停止mysql 使用mysqld_safe——user=mysql——datadir=/usr/local/var/mysql/启动服务器(根据需要更改路径) 运行mysql_upgrade -u root -p password(在另一个终端窗口) 关闭运行中的服务器mysqladmin -u root -p password shutdown 以正常模式重新启动服务器。服务器启动或酿造服务启动mysql

相关文件在这里。

在升级WAMP但没有数据库备份后,我遇到了这个问题。

这招对我很管用:

停止新的WAMP 从旧WAMP安装中复制所需的数据库目录和ibdata1文件 删除“ib_logfile0”和“ib_logfile1” 开始里面

现在应该能够对数据库进行备份了。但是,当您的服务器重新启动后,您仍然会遇到问题。所以现在重新安装WAMP并导入数据库。

对我来说有效的方法是扔掉桌子,即使它根本不存在。然后,我重新创建了表,并从以前完成的sql转储中重新填充。

一定有一些表名的元数据库,它很可能仍然存在,直到我删除它。

以防还有人关心:

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

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

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

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

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

在我的情况下,当我导入导出的sql文件时,我得到了一个错误,比如创建表查询的表不存在。

我意识到在我的数据库名中有一个下划线,mysql在这之前放了一个转义字符。

所以我删除了数据库名称中的下划线,一切都解决了。

希望这也能帮助到其他人。