【问题标题】:Mysql: Table exists and doesn't existMysql:表存在和不存在
【发布时间】:2018-09-17 16:48:26
【问题描述】:

我有一个被删除的表(“filescan”)。当我转到数据目录并使用 ls 列出文件时,名称不存在 - 所以它真的消失了。但是在mysql中,我得到了这个:

mysql> select * from filescan;
ERROR 1146 (42S02): Table 'db1.filescan' doesn't exist
mysql> create table filescan (id int);
ERROR 1813 (HY000): Tablespace '`db1`.`filescan`' exists.
mysql> 

我假设某处有一个表告诉 mysql 该文件存在,而实际上它不存在。对于处理这个薛定谔的 mysql 表的例子有什么建议吗?

【问题讨论】:

  • 您的数据库似乎已损坏。 InnoDB 还是 MyISAM?

标签: mysql exists not-exists


【解决方案1】:

如果被删除的表使用的是 InnoDB 存储引擎(并且问题中显示的 CREATE TABLE 语句中未指定引擎,因此表使用默认的 ,,, )

 SHOW VARIABLES LIKE 'default_storage_engine'

如果 innodb_file_per_table 在最初创建表时已启用,并且仍然处于启用状态...

 SHOW VARIABLES LIKE 'innodb_file_per_table'

我建议数据库目录中可能有一个孤立的 .ibd 文件

 SHOW VARIABLES LIKE 'datadir'

从操作系统命令行,将目录切换到数据库目录,并检查与表名匹配的文件

 # cd /var/lib/mysql
 # cd db1
 # ls -l filescan*

假设表没有分区(再次假设 InnoDB),表应该有一个filescan.frm 文件和一个filescan.ibd 文件。

听起来filescan.ibd 文件存在,而filescan.frm 不见了。

如果是这种情况,我会考虑删除该表。我会重新定位(移动)filescan.ibd 文件(到另一个目录,安全的地方,作为备份,例如)

 # mv filescan.ibd /backup/

然后尝试再次运行CREATE TABLE 语句。


目前还不清楚 MySQL 如何允许删除 .frm 文件并保留 .ibd 文件。最合理的解释是 .frm 文件被 MySQL 以外的其他东西从文件系统中删除。或者.frm.ibd文件被删除,.ibd文件后来被恢复。)


对于 InnoDB 以外的存储引擎,问题可能类似。 (例如,对于 MyISAM,.MYD 和/或 .MYI 文件在没有 .frm 文件的情况下存在。)

【讨论】:

  • 您的分析非常出色。找到文件并删除它,错误消息消失了......并被另一个替换,猜猜这意味着另一个问题。谢谢!进展顺利!
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2018-08-02
  • 2012-05-19
相关资源
最近更新 更多