错误:表xxx的表空间存在。 请在IMPORT之前丢弃表空间

我是相当新的MySQL,我得到一个非常有趣的错误,我无法通过谷歌和stackoverlfowsearchfind任何帮助。

我在MacOS 10.8.3上运行mySQL 5.6.10的本地服务器,并通过Navicat essentials for MySQLpipe理我的数据库。

我得到的错误是,运行和pipe理我的数据库后,好几天/每周触发(它似乎不完全)删除我使用Navicat内查询创build的一些表。

当我尝试使用这些表来运行查询时,Navicat会警告我这个特定的表不存在。 到目前为止这么好 – 来了好的部分:

当我尝试创build表,例如名为“temp”,以前那里,我得到以下错误信息:

Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT. 

但是,如果我尝试删除表,或尝试放弃此表的表空间使用

 DROP TABLE temp; ALTER TABLE temp DISCARD TABLESPACE; 

我收到以下错误消息:

 Error : Unknown table 'database.temp' Error : Table 'database.temp' doesn't exist 

所以这意味着我build议放弃表空间,但是当我尝试这样做时表不存在。 DISCARD查询不检查的地方有没有可能存在某种types的剩余表格? 有没有人有一个想法是什么可以触发所有这一切 – 完全随机的看起来?

正如我所说,我对这个主题很陌生,而且很无能。 我怀疑重新启动我的笔记本电脑,即重置我的本地MySQL服务器,或者用户许可权可能与它有关,但我只是在这里假设。

非常感谢您的帮助。

在这里稍微晚一点,但通常我看到这个问题发生时,当你在'innodb_file_per_table'模式下运行时得到一个'表空间满'的错误。 没有太多细节(更多),数据库服务器的表空间由innodb_data_file_path设置定义,默认情况下是相当小的。 即使做得更大,“表空间满”仍然可能发生在更大的查询中,并且这样(大量的非表“东西”被存储在那里,撤消日志,caching等等)。

无论如何,我发现,如果你在操作系统目录中存储每个表的文件,在OSX默认的/ var / lib / mysql,/ usr / local / var / mysql用homebrew iirc,你会发现孤儿tablename.ibd文件没有它的正常伴侣tablename.frm文件。 如果将该.ibd文件移到安全的临时位置(只是为了安全起见),才能解决问题。

 $ ls /var/lib/mysql table1.frm table1.idb table2.frm table2.ibd table3.idb <- problem table, no table3.frm table4.frm table4.idb $ mkdir /tmp/mysql_orphans $ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/ 

一个警告虽然,请确定是什么原因造成的问题,例如长时间运行的查询,locking表等已被清除。 否则,当你第二次尝试时,你最终会得到另一个孤立的.ibd文件。

Xamppp和Mamp用户

在导入数据库时​​(在清空它之后)有相同的错误通过MySQL。 我发现我有一个tablename.ibd文件,而所有其他人被删除。 我从mysql/data/database_name手动删除它,错误消失了。

对于WAMP [Windows 7旗舰版x64位]用户:

我同意DangerDave所说的,所以我正在为WAMP用户提供一个答案。

注意:首先,你必须去.. \ WAMP \ Bin \ MySQL \ MySQL [你的MySQL版本] \ Data文件夹。

现在,您将看到所有数据库的文件夹

  • 双击具有违规表的数据库的文件夹以将其打开
  • 不应该有一个文件[Your offending MySQL table name].frm ,而应该有一个文件[Your offending MySQL table name].ibd
  • 删除[Your offending MySQL table name].ibd
  • 然后,也从回收站中删除它
  • 然后在数据库上运行你的MySQL查询,你就完成了

在尝试创build用户表时,我在运行wampserver时遇到了同样的错误。 我find了一个users.ibd文件,在我删除这个文件之后,我再次运行了migrate命令,它工作。 我的Windows机器上的文件位于wamp / bin / mysql / mysql5.6.12 / data / myproject中。

然而,更简单的select是这样的:重新启动mysql,然后执行文章开头附近列出的相同的四个步骤。 这样,数据字典上的表空间id和文件匹配; 从而导入表空间成功。

这可以让你更有信心在恢复过程中处理一些InnoDB“疑难杂症”,甚至文件传输。

REF

如果删除后重新创build.idb ,请阅读此答案。

这是怎么跟我一起工作的。 我有.idb文件没有它相应的.frm ,每当我删除.idb文件,数据库再次重新创build它。 我在mysql 文档中find了解决scheme( 表空间不存在部分)

1-在其他数据库目录中创build一个匹配的.frm文件,并将其复制到孤立表所在的数据库目录中。

2-发布原始表的DROP TABLE。 这应该成功地删除表和InnoDB应该打印错误日志的.ibd文件丢失的警告。

我复制了另一个表.frm文件,并将其命名为缺less的表,然后进行正常的删除表查询。 和voalla它的工作和表正常丢弃!

我的系统是Windows MariaDB v 10.1.8上的xampp

试图删除表空间可以给你其他的错误。 对我来说,我得到了以下错误:

 DROP TABLESPACE `tablename` Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP' 

我的解决scheme是放弃数据库。 这将删除与其相关的任何表空间,并允许您再次创build表。

如果您有另一台服务器与同一个表的好版本,您可以复制(table_copy),将table_copy传输到问题服务器。 然后删除问题表并将table_copy重命名为表。

删除/移动tablename.ibd确实没有为我工作。

我是如何解决它的

由于我要删除损坏的和不存在的表,我通过转到phpmyadmin-> database-> export->select的表来备份其他表,以备份 – >导出(如.sql)。

之后,我select数据库名称旁边的数据库图标,然后将其删除。 创build一个新的数据库。 select你的新数据库 – >导入 – >select你之前下载的文件 – >点击导入。 现在我有我的旧工作表,并删除损坏的表。 现在我只是创build抛出错误的表。

可能我有一个早期的损坏的表的备份。

当您暂停某些function时发生此错误。 像使用不正确的外键运行下面的查询一样。

 set foreign_key_checks=0 

有这个问题多次。 如果你有一个大的数据库,并想尝试避免备份/恢复(添加缺less的表),尝试来回几次:

DROP TABLE my_table;

ALTER TABLE my_table DISCARD TABLESPACE;

-和-

rm位于/ var / lib / mysql / my_db /目录下的my_table.ibd(orphan w / o对应my_table.frm)

-接着-

CREATE TABLE IF NOT EXISTS my_table (…)

这里是解决scheme的步骤:

  1. 备份您的数据库(具有丢弃选项和数据的结构)
  2. 停止mysql引擎服务
  3. 从mysql / data中手动删除数据库目录
  4. 启动mysql引擎
  5. 使用与损坏的数据库不同的名称创build新的数据库
  6. 使用新数据库中已损坏的表的名称创build单个表(这是秘密)。 最好创build一个完全相同结构的表格。
  7. 将数据库重命名为旧损坏的数据库
  8. 恢复你的备份和你的表将工作正常。

我只删除我的老数据库位于我的本地主机直接从瓦特,停止所有服务,去wamp / bin / mysql / mysql [版本] /数据,我发现数据库与问题,我删除它,并重新启动瓦特所有服务,再次创build你的数据库,并完成,现在你可以导入你的表,

如果你有这个问题,你没有其他的select将引擎更改为任何其他引擎,如“myisam”,然后尝试创build表。

免责声明:这不是有效的答案,因为您可能有其他存储引擎不支持的外键约束。 每个存储引擎都有自己的专业来存储和访问数据,这些点也被考虑在内。

  • mysql -e“select @@ datadir”

  • 转到该文件夹

  • sudo rm -rf DB_NAME