mysql - 错误 : Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT

标签 mysql macos navicat tablespace

我对 MySQL 还很陌生,遇到了一个非常有趣的错误,我无法通过 google 和 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 服务器,或者用户权限可能与它有关,但我只是在这里假设。

最佳答案

这里有点晚了,但通常我已经看到当您在“innodb_file_per_table”模式下运行时出现“表空间已满”错误时会发生此问题。无需过多介绍(更多 here ),数据库服务器的表空间由 innodb_data_file_path 设置定义,默认情况下相当小。即使做得更大,“表空间已满”仍然可能发生在更大的查询等情况下(大量非表“东西”存储在其中,撤消日志、缓存等......)。

无论如何,我发现如果你查看存储每个表文件的 OS 目录,OSX 上默认为/var/lib/mysql,使用 homebrew iirc 的/usr/local/var/mysql,你将找到一个孤立的 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 文件。

关于mysql - 错误 : Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694168/

相关文章:

linux - 在 MacOS 中改变 Linux 中的滚动速度

使用 Htaccess 将 php $_GET 项目添加到虚拟子域

mysql - 防止 mysql 查询给出多行相同的 id

mysql - 需要有关 mysql 模式设计的帮助 - 当前模式需要触发器中的动态 sql

java - 为什么我在使用 --option 运行时进行协同设计后无法启动 Java 应用程序

mysql - 从 SELECT 查询中获取具有最大值的记录

php - Datatables 列中的 MySQL 循环

mysql - ln :/usr/bin/mysql: Operation not permitted

mysql - Navicat (MySQL) 字符编码错误

sql - UNION 子查询的奇怪行为,为什么?