Mysql:表存在且不存在

时间:2018-04-08 01:04:09

标签: mysql exists not-exists

我有一个被删除的表(“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这个文件存在的表,实际上它没有。有关处理Schödinger的mysql表这个例子的任何建议吗?

1 个答案:

答案 0 :(得分:0)

如果删除的表使用的是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'

从OS命令行,将目录更改为数据库目录,并检查与表名称匹配的文件

 # 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文件。)