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

我是相当新的 MySQL,我得到了一个非常有趣的错误,我不能找到任何帮助,通过谷歌和堆栈溢出搜索。

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

我得到的错误是,在运行和管理我的数据库几天/几周之后,有些触发器(看起来不完全)删除我使用 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 服务器,或者用户权限可能与此有关,但我只是在这里假设。

353535 次浏览

解决方案

然而,更简单的选择是: 重新启动 MySQL,然后执行以下相同的四个步骤:

1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table

这样,数据字典上的表空间 id 与文件匹配; 因此导入表空间成功了。

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

裁判

尝试删除表空间可能会导致其他错误:

DROP TABLESPACE `tablename`


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

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

这里有点晚,但通常我看到这个问题发生时,你得到一个’表空间完整’错误时,运行在一个’无害的 b _ file _ per _ table’模式。不需要详细说明(更多的 给你) ,数据库服务器的表空间是由 inodb _ data _ file _ path 设置定义的,默认情况下相当小。即使变得更大,“表空间已满”仍然可能发生在更大的查询之类的情况下(那里存储了许多非表的“东西”,撤销日志,缓存等等... ..。.).

无论如何,我发现如果你在 OS 目录中查找每个表中存储的文件,在 OSX 上默认是/var/lib/mysql,/usr/local/var/mysql 和自制的 iirc,你会发现一个孤立的 tablename.ibd 文件,没有它的正常伴侣 tablename.frm 文件。如果你动一下的话。将 ibd 文件放到一个安全的临时位置(只是为了安全起见) ,以便修复该问题。

$ ls /var/lib/mysql


table1.frm
table1.idb
table2.frm
table2.idb
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 文件时。

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

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

Xampp 和 Mamp 用户

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

有过好几次这样的问题。如果你有一个很大的数据库,想要避免备份/恢复(增加了缺失的表) ,尝试几次来回:

DROP TABLE my _ TABLE;

我 _ 表丢弃 TABLESPACE;

还有

Rm my _ table. ibd (对应于 my _ table. frm 的孤儿 w/o)位于/var/lib/mysql/my _ db/目录中

然后

如果表不存在,则创建 my_table(...)

对于 WAMP [ Windows7终极 x64位]用户:

我同意危险戴夫所说的,所以我为 WAMP 用户提供一个可用的答案。

注意: 首先,您必须转到您的 . . WAMP Bin MySQL MySQL [ Your MySQL Version ] Data文件夹。

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

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

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

我是怎么破案的

因为我要删除损坏的和不存在的表,所以我通过转到 phpmyadmin-> database-> export-> select tables to back-> export (as)来备份其他表。Sql).

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

很可能我之前备份了已损坏的表。

以下是解决方案的步骤:

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

当您挂起某些函数时会发生此错误。例如,使用不正确的外键运行下面的查询。

set foreign_key_checks=0

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

如果在删除 .idb之后又重新创建了它,那么请阅读这个答案。

这就是我的工作方式。我有 .idb文件没有相应的 .frm,每当我删除 .idb文件,数据库重新创建它。我在 MySQL文件(表空间不存在部分)的一行中找到了解决方案

1-创建一个匹配。然后将其复制到孤立表所在的数据库目录中。

2-为原始表发出 DROPTABLE。应该成功删除该表,并且 InnoDB 应该向错误日志打印一个警告,说明。IBD 文件不见了。

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

我的系统是 XAMPP 在 WindowsMariaDB v10.1.8上

如果你有这个问题,你没有其他选择改变引擎为任何其他引擎,如“ myisam”,然后尝试创建表。

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

对我来说,唯一的解决办法就是:

  1. 创建表 bad_table引擎 = MyISAM..。
  2. Rm bad _ table. ibd
  3. 放下表 bad_table

我发现“解决”这个问题的方法相当烦人,但是有一个脚本可以处理它。

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

帮助解决这个问题的脚本是 https://github.com/uberhacker/shrink-ibdata1,尽管这个脚本的指定用途不同,但它是 是的解决这个问题的。

请在导入之前丢弃表空间

我得到了相同的问题解决方案如下

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

  2. 同样,您必须创建新的数据库并导入旧的 sql 文件

谢谢

这正是我在 Mariadb 10.2.16中在 Fedora 上所做的,当时我有一个表,在日志文件中显示完全相同的错误,我想..。

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

Create table 也是这样失败的:

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 用户身份执行了下列操作,以确认无害表. ibd 的覆盖导致了我们的问题

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd 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)

编辑: 我本来想加一个

restorecon -Rv /var/lib/mysql/database_name

命令在复制数据库之后获取所有 selinux 上下文 他们应该是,即使我们正在删除他们从 数据库,但在另一种情况下,您可以只添加 这两个 cp 命令的—— archive 或-a 选项,所以实际上是 存档选项缩短了这一点:

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
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb

我认为下面的代码更好,它保留了 selinux 为已制作的表设置的上下文。

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

我已经将上面较长的命令列表替换为较短的列表 还可以用 * 缩写

遇到了完全相同的问题; 我在之前的5.5之后加入了 mysql@5.6

默认值为5.6的啤酒是 innodb_file_per_table=1,而默认值为5.5的啤酒是 innodb_file_per_table=0

您现有的 ibdata1文件(合并的 inodb 数据)仍然具有对您试图创建/删除的表的引用。要么将 innodb_file_per_table修改回0,要么删除 ibdata1数据文件(这将丢失所有数据,所以请确保您的 mysqldump 首先或已经有一个. sql 转储)。

另一个困扰我的问题是缺少一个端口,所以网络默认是 unix 套接字,mysql 客户端不断报告:

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

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

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

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

显示变量 WHERE Variable _ Name LIKE“% dir”

然后强制删除该数据库:

Sudo rm-rf

对我来说,它只是帮助到 MYSQL 数据目录下的 /var/lib/mysql/{ db _ name }(linux)和删除 { table _ name } . ibd文件,这是相同的文件夹名称。

您可以作为 mysql 根用户运行以下查询

drop tablespace `tableName`

唯一对我有效的方法就是:

  1. 创建一个类似的表
  2. 将新的类似表的. from 和. idb 文件复制到损坏表的名称。
  3. 修复权限
  4. 重启 MariaDB
  5. 放下腐败的桌子

就我而言:

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

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

谢谢 # 危险戴夫这解决了我的问题 Magento 2,这就是我怎么做的

我是副总统

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


root@myvps [~]# ls

检查带有数字 ffie (只有. idb)的表并删除它们,

rm customer_grid_flat.ibd

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

对于 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

注意: 在我的情况下,我不关心数据,因为它是开发安装,可能发生因为我恢复了我的膝上型计算机与时间机器

我有同样的问题。我重命名数据库名称和导入它。然后它的工作。

简单点说: 就是 重命名数据库名称就是这样。

问题是现有的数据库名称在您的文件夹中有一些条目。这就是问题所在。要么您需要删除所有相关条目,要么 只要简单地重命名数据库即可