我有一个被删除的表(“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表这个例子的任何建议吗?
答案 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文件。)