MySQL无法从现有表中进行选择,因为它不存在?

时间:2014-09-25 17:49:25

标签: mysql

我不知道发生了什么事。我有一个名为project_share_invite的表。几个小时前(在我们的生产环境中)我不能再对这个表发出SELECT。 MySQL声称该表不存在,尽管它显示在show tables上。今天在机器上发生的唯一值得注意的事件是例行包升级(通过apt)。

mysql> use analytics;
Database changed

mysql> show tables like 'project_share_invite';
+--------------------------------------------+
| Tables_in_analytics (project_share_invite) |
+--------------------------------------------+
| project_share_invite                       |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select count(*) from project_share_invite;
ERROR 1146 (42S02): Table 'analytics.project_share_invite' doesn't exist

想法?这对我没有任何意义。

更新:表的文件仍然存在于磁盘上(分别为project_share_invite.frmproject_share_invite.idb)并且其中包含内容。

快速重启MySQL并没有解决这个问题。

更新:使用root帐户而不是特定用户帐户时结果相同。

更新:我无法重新创建表格。

CREATE TABLE `analytics`.`project_share_invite` ( ... )
ERROR 1146 (42S02): Table 'analytics.project_share_invite' doesn't exist

更新:应该先检查错误日志:

InnoDB: Load table 'analytics/project_share_invite' failed, the table has missing foreign key indexes. 

虽然我不知道它是如何进入这种状态的。

2 个答案:

答案 0 :(得分:9)

看起来你遇到了存在外键约束的MySQL中的已知错误,但关联的索引被删除了。请参阅:http://bugs.mysql.com/bug.php?id=68148

根据MySQL的版本(似乎您需要5.6或>),您可以通过关闭外键检查然后重新创建缺失的索引来解决此问题。

SET FOREIGN_KEY_CHECKS=0;

您应该使用SHOW CREATE TABLE table name

检查结构

然后使用CREATE INDEX重新创建缺失的索引。

答案 1 :(得分:1)

此错误通常是由在文件系统级别移动文件引起的。

请记住,SHOW TABLES只读取.frm文件,但是一旦查询表,MySQL就会调用存储引擎。 InnoDB有一个自己的内部管理元数据的方式,在一个"数据字典"它始终存储在ibdata1

因此,如果您移动了datadir但忘记了ibdata1文件(或从另一个实例复制了ibdata1),那么InnoDB数据字典就不会知道该表,即使SHOW TABLES也是如此。

另一种可能性是您复制了数据文件,现在他们没有写入所有权或文件权限。因此,例如.frm文件是可读的,但.ibd不是。它们应该由mysql:mysql拥有和编写。

如果您的apt升级更改了文件位置或文件权限,那么也可能导致它。我建议使用ls -l来验证文件的权限。