我不知道发生了什么事。我有一个名为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.frm
和project_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.
虽然我不知道它是如何进入这种状态的。
答案 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
来验证文件的权限。