错误:表空间表XXX存在。 ,请丢弃导入前表(Error: Tablespace for tab

2019-08-18 03:51发布

I am fairly new to MySQL and I am getting a pretty interesting error on which I cannot find any help via google and the stackoverflow search.

I am running a local server of MySQL 5.6.10 on MacOS 10.8.3 and manage my database via Navicat essentials for MySQL.

The error I get is that after running and managing my database just fine for a couple of days/weeks something triggers to (it appears incompletely) delete some of the tables I created using queries from within Navicat.

When I try to run queries using these tables, Navicat then warns me that the particular table does not exist. So far so good - here comes the good part:

When I try to CREATE the table, e.g. named "temp", that was previously there, I get the following error message:

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

However, if I try to drop the table, or try to discard the tablespace for this table, using

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

I get the following error messages:

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

So that means that I am advised to discard the table space but when I try to do so the table does not exist. Is it possible that there is some type of remnant of this table at a different place where the DISCARD query isn't checking? And does anybody have an idea what could trigger all that - completely randomly as it seems?

As I said, I'm new to the subject and pretty much clueless. I suspect that re-booting my laptop, i.e. resetting my local MySQL server, or maybe user permission rights might have to do with it, but I am just hypothesizing here.

Answer 1:

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

不管怎么说,我发现,如果你在OS目录中查找其中的文件,每个表都存储在/ var / lib中/ MySQL的默认的OSX,在/ usr /本地的/ var / mysql的用自制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文件,当您尝试第二次。



Answer 2:

XAMPP和甲基苯丙胺用户

在导入数据库(排空后)有同样的错误低谷的MySQL。 我发现,我有一个tablename.ibd左边,而其他所有被删除的文件。 我手动删除它从mysql/data/database_name和错误消失了。



Answer 3:

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

我同意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查询,即可大功告成


Answer 4:

如果你得到.idb再重新将其删除后,再读取这个答案。

这究竟是怎么跟我一起工作。 我有.idb文件,没有它的相应的.frm ,每当我删除.idb文件,数据库再次重新创建它。 我发现的MySQL在一条线中的溶液文档 ( 表空间不存在的部分)

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

2-问题DROP TABLE为原始表。 这应该成功删除表和InnoDB应打印警告错误日志的文件的.ibd失踪。

我复制另一个表.frm文件,并将其命名为像我缺少的表,然后进行正常的降表查询。 和voalla它的工作和表通常是下跌!

我的系统是Windows MariaDB的v 10.1.8 XAMPP



Answer 5:

在我的情况下,唯一的工作解决办法是:

  1. CREATE TABLE bad_table ENGINE = MyISAM数据...
  2. RM bad_table.ibd
  3. DROP TABLE bad_table


Answer 6:

然而,更容易的选择是这样的:重启MySQL,然后做靠近文章的开头列出的相同的四个步骤。 通过这种方式,在数据字典和匹配文件的表空间ID; 因此导入表成功。

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

REF



Answer 7:

我上wampserver运行它试图创建一个用户表了同样的错误。 我发现了一个users.ibd文件后,我删除了这个文件,我再次运行迁移命令和它的工作。 我的Windows机器上的文件位于WAMP /斌/ MySQL的/ mysql5.6.12 /数据/ myproject的。



Answer 8:

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

我该如何解决它

因为我要删除已损坏和不存在的表,我转到phpmyadmin->数据库 - >导出 - >选择的表到备份 - >导出(如.SQL)采取其他表的备份。

从那以后,我选择了旁边的数据库名称数据库图标,然后放弃了它。 创建一个新的数据库。 选择新的数据库 - >导入 - >选择你下载的文件earlier->单击导入。 现在我有我的旧工作表,并有损坏的表中删除。 现在我只创建一个被扔错误的表。

可能我有损坏的表的以前的备份。



Answer 9:

下面是解决步骤:

  1. 备份数据库(结构,降选项和数据)
  2. 停止MySQL的引擎服务
  3. 从内侧的MySQL /数据手动删除数据库目录
  4. 启动mysql引擎
  5. 从您的损坏的数据库不同的任何名称创建新的数据库
  6. 创建一个表与新的数据库中损坏的表的名称(这是秘密)。 而且最好是用完全相同的结构创建表。
  7. 数据库重命名为损坏的旧数据库
  8. 恢复您的备份和您的表将做工精细。


Answer 10:

当你暂停部分功能会出现此错误。 就像下面运行不正确的外键查询。

set foreign_key_checks=0


Answer 11:

这正是我在Fedora上MariaDB的16年2月10日做的时候,我有一个表,正好表现出在日志文件中我想同样的错误......

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...

与DROP TABLE不工作,以及ALTER TABLE ...

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的/数据库名称目录中,我做了承认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控制台我在两个表发出一个成功的指令下降

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)


Answer 12:

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

DROP TABLESPACE `tablename`

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

我的解决办法是删除数据库。 这将删除与之相关的任何表空间,让您再次创建表。



Answer 13:

如果你有一个很好的版本,你可以复制(table_copy)在同一个表的另一台服务器时,table_copy转移到问题的服务器。 然后删除问题表,并重新命名table_copy表。



Answer 14:

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

DROP TABLE MY_TABLE;

ALTER TABLE MY_TABLE DISCARD TABLESPACE;

-和-

RM my_table.ibd(孤儿W / O对应my_table.frm)位于/ var / lib中/ MySQL的/ MY_DB /目录

-然后-

CREATE TABLE IF NOT EXISTS my_table (...)



Answer 15:

有完全相同的问题; 我沏新增mysql@5.6 (在前面有5.5)。

酿造默认值5.6是innodb_file_per_table=1 ,而在5.5他们innodb_file_per_table=0

您现有的ibdata1的文件(合并InnoDB的数据)仍然要你试图创建/删除表的引用。 要么改变innodb_file_per_table回0,或删除ibdata1中的数据文件( 这会失去你所有的数据,所以一定要确保你mysqldump的首先还是已经有.SQL转储 )。

其他酿造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



Answer 16:

对我来说,它有助于只要进入MySQL数据目录在/ var / lib中/ MySQL的/ {DB_NAME}(Linux版)和下降{} table_name的文件的.ibd这是相同的文件夹名称。



Answer 17:

我只是删除我的旧的数据库设在我的本地主机直接从WAMP,停止所有服务,进入WAMP /斌/ MySQL的/ mysql的[版本] /数据,我发现DB与problemas,我将其删除并重新开始WAMP的所有服务,再次创建数据库和它完成,现在你可以导入你的表,



Answer 18:

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

从本质上讲,你需要的ibdata1ib_logfile*文件消失(它们包含外键的映射关系,除其他事项外)。 比较安全的方法做,这是对所有的数据库导出,mysql的停止,删除文件,启动mysql,然后导入文件。

可以帮助解决这个问题的脚本https://github.com/uberhacker/shrink-ibdata1 ,即使这个脚本的既定目的是不同的,但它确实解决问题。



Answer 19:

您可以运行下面的查询作为MySQL root用户

drop tablespace `tableName`


Answer 20:

如果你有这样的问题,你不要有另一种选择更换引擎为任何其他引擎一样“的MyISAM”,然后尝试创建表。

免责声明:这是不是您也可能不会被另一个存储引擎支持外键约束的有效答案。 每个存储引擎都有自己的特长来存储和访问数据,在考虑采取这些点也。



Answer 21:

,请丢弃导入前表

我有同样的问题的解决方案是低于

  1. 首先,你必须放下你的数据库名称。 如果你的数据库不会删除你流了我。 对于Windows系统目录为C:/ XAMPP / MySQL的/数据/ yourdabasefolder删除 “yourdabasefolder”

  2. 同样,你必须创建新的数据库和导入旧SQL文件。 这将是工作

谢谢



Answer 22:

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

SHOW VARIABLES WHERE变量名称LIKE “%DIR”

然后强制删除数据库:

须藤室射频



文章来源: Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT