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

时间:2013-03-28 23:49:53

标签: mysql macos navicat tablespace

我对MySQL很新,我收到一个非常有趣的错误,我无法通过谷歌和stackoverflow搜索找到任何帮助。

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

我得到的错误是,在运行和管理我的数据库之后,几天/几周就会触发一些触发器(它看起来不完整)删除我在Navicat中使用查询创建的一些表。

当我尝试使用这些表运行查询时,Navicat会警告我特定的表不存在。到目前为止一切都很好 - 这里有很好的部分:

当我尝试创建表时,例如命名" 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

这意味着我建议丢弃表空间但是当我尝试这样做时表不存在。是否可能在DISCARD查询未检查的其他位置存在某种类型的此表的剩余部分?有没有人知道什么可以触发所有这些 - 完全随机的似乎?

正如我所说,我是这个主题的新手,几乎一无所知。我怀疑重新启动我的笔记本电脑,即重置我的本地MySQL服务器,或者用户权限可能与它有关,但我只是假设在这里。

26 个答案:

答案 0 :(得分:99)

这里有点晚了但通常我看到当你在'innodb_file_per_table'模式下运行时出现'tablespace full'错误时会出现这个问题。没有太多细节(更多here),数据库服务器的表空间由innodb_data_file_path设置定义,默认情况下相当小。即使做得更大,“表空间已满”仍然会出现更大的查询等(很多非表'东西'存储在那里,撤消日志,缓存等......)。

无论如何,我发现如果你查看存储每个表文件的操作系统目录,默认情况下是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/

但有一点需要注意,确保最初导致问题的原因,例如:长时间运行的查询,锁定表等...已被清除。否则,当你第二次尝试时,你最终会得到另一个孤立的.ibd文件。

答案 1 :(得分:61)

Xampp和Mamp用户

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

答案 2 :(得分:20)

对于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查询并完成

答案 3 :(得分:17)

如果您在删除.idb后再次重新创建.idb,请阅读此答案。

这是如何与我合作的。我有.frm文件而没有相应的.idb,每当我删除.frm文件时,数据库会再次重新创建它。我在mysql documentation中找到了一行解决方案(表空间不存在部分)

  
    

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

         

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

  

我复制了另一个表Mpociot\Firebase\SyncsWithFirebase文件并将其命名为我丢失的表,然后进行正常的drop table查询。和voalla一起工作,桌子正常掉落!

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

答案 4 :(得分:5)

就我而言,唯一的解决方案是:

  1. CREATE TABLE bad_table ENGINE = MyISAM ...
  2. rm bad_table.ibd
  3. DROP TABLE bad_table

答案 5 :(得分:4)

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

答案 6 :(得分:4)

解决方案

但是,更简单的选择是:重启mysql,然后执行帖子开头附近列出的相同的四个步骤。这样,数据字典上的表空间id和文件匹配;因此导入表空间成功。

这可以让你更有信心在恢复过程中处理一些InnoDB“陷阱”甚至是文件传输。

ref

答案 7 :(得分:3)

就我而言:

首先从Mysql中删除数据库目录中的tableName.ibd,然后再次运行:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

答案 8 :(得分:2)

这正是我在fedora上的mariadb 10.2.16中所做的事情,当时我有一个表在日志文件中显示与我猜想的完全相同的错误...

2018-07-11  9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11  9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918

您的行驶里程和错误可能会有所不同,但我认为的主要目标是

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

删除表无法正常工作,而更改表...

MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'

MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist

创建表也失败,如下:

MariaDB [database_name]> create table  innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT

为了解决这个问题,我首先要做的是

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

然后在/ var / lib / mysql / database_name目录中,我以root用户身份执行以下操作,以确认覆盖innodb_table.ibd导致了我们的问题

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
systemctl restart mariadb

然后回到mysql控制台,我在两个表上都成功发出了drop命令

MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: database_name

Query OK, 0 rows affected (0.08 sec)

MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)

现在一切都变成正方形了,我可以重新创建一张桌子...

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)

答案 9 :(得分:2)

删除/移动tablename.ibd肯定对我不起作用。

我是如何解决的

由于我要删除损坏的和不存在的表,我通过转到phpmyadmin-&gt; database-&gt; export-&gt;选择的表到backup-&gt; export(作为。)来备份其他表。 SQL)。

之后,我选择了数据库名称旁边的数据库图标,然后将其删除。创建了一个新的数据库。选择新数据库 - &gt; import-&gt;选择您之前下载的文件 - &gt;单击导入。现在我有我的旧工作表并删除了损坏的表。现在我只是创建了抛出错误的表。

可能我早先备份了损坏的表格。

答案 10 :(得分:2)

以下是解决方案步骤:

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

答案 11 :(得分:2)

暂停某些功能时会发生此错误。就像使用错误的外键运行下面的查询一样。

set foreign_key_checks=0

答案 12 :(得分:1)

有完全相同的问题;我会冲泡添加mysql@5.6(之前为5.5)。

5.6的Brew默认值是innodb_file_per_table=1,而5.5中的默认值是innodb_file_per_table=0

您现有的ibdata1文件(合并的innodb数据)仍将引用您要创建/删除的表。将innodb_file_per_table改回0,或删除ibdata1数据文件(这将丢失所有数据,因此请确保先对它进行mysqldump或已经有.sql转储)。 / p>

另一个困扰我的mysql@5.6默认是缺少端口,因此网络默认是unix套接字,并且mysql客户端会不断报告:

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

我在<string>--port=3306</string>数组中添加了.plist,但是您也可以在port=3306中指定my.cnf

运行brew services stop mysql@5.6进行更改,然后brew services start mysql@5.6

答案 13 :(得分:1)

对我来说,它只是帮助转到了 / var / lib / mysql / {db_name} (Linux)下的MYSQL DATA目录,并删除了 {table_name} .ibd 文件,与文件夹名称相同。

答案 14 :(得分:1)

有好几次这个问题。如果您有一个大型数据库并且想要尝试避免备份/恢复(添加丢失的表),请来回尝试几次:

DROP TABLE my_table;

ALTER TABLE my_table DISCARD TABLESPACE;

- 和 -

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

- 然后 -

CREATE TABLE IF NOT NOT EXISTS my_table(...)

答案 15 :(得分:1)

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

答案 16 :(得分:1)

尝试删除表空间可能会给您带来其他错误。对我来说,我收到以下错误:

DROP TABLESPACE `tablename`

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

我的解决方案是删除数据库。这将删除与其相关的所有表空间,并允许您再次创建表。

答案 17 :(得分:0)

您可以以mysql根用户身份运行以下查询

drop tablespace `tableName`

答案 18 :(得分:0)

它对我有用的唯一方法是:

  1. 创建类似的表格
  2. 将新的相似表的.frm和.idb文件复制到损坏的表的名称。
  3. 修复权限
  4. 重新启动MariaDB
  5. 删除损坏的表

答案 19 :(得分:0)

谢谢#DangerDave解决了我在Magento 2上的问题,这就是我的做法

我在使用vps

$ex = json_decode($data, true);

检查没有.frm文件(仅.idb)的表并将其删除,

root@myvps [~]# cd /var/lib/mysql/mydatabasename/

root@myvps [~]# ls

运行index:reindex命令后,系统将重新生成表

答案 20 :(得分:0)

我找到的方式&#34;解决&#34;这个问题相当烦人,但有一个脚本可以处理它。

基本上,您需要ibdata1ib_logfile*文件消失(它们包含外键的映射,以及其他内容)。唯一的安全方法是导出所有数据库,停止mysql,删除文件,启动mysql,然后导入文件。

帮助解决此问题的脚本是https://github.com/uberhacker/shrink-ibdata1,即使此脚本的声明目的不同, 也可以解决问题。

答案 21 :(得分:0)

我只是直接从wamp删除我的本地主机中的旧数据库,停止所有服务,转到wamp / bin / mysql / mysql [版本] /数据,我发现数据库有问题,我删除它并重新开始wamp所有服务,再次创建您的数据库并完成,现在您可以导入您的表,

答案 22 :(得分:-1)

如果是 Homebrew,数据文件的目录是 /usr/local/var/mysql

要查看这里使用的是哪个 my.cnf 文件是我的环境中的搜索位置 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

为了清除这个错误,我做了以下事情

mysqladmin -u root shutdown
rm /usr/local/var/mysql/<dbname>/problemtablename.ibd

注意:在我的情况下,我不关心数据,因为它是开发设置,可能是因为我用时间机器恢复了我的笔记本电脑

答案 23 :(得分:-1)

我必须找到我的MySQL数据目录:

在变量名称为“%dir”的情况下显示变量

然后强行删除该数据库:

sudo rm -rf

答案 24 :(得分:-1)

请在IMPORT

之前删除表空间

我遇到了同样的问题解决方案

  1. 首先,您必须删除数据库名称。如果你的数据库没有删除你就流了我。 对于Windows系统,您的目录将是 C:/ xampp / mysql / data / yourdabasefolder删除&#34; yourdabasefolder&#34;

  2. 您必须再次创建新数据库并导入旧的sql文件。这将是工作

  3. 由于

答案 25 :(得分:-1)

如果您遇到此问题且没有其他选项,请将引擎更改为“myisam”等任何其他引擎,然后尝试创建表格。

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