我对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设置定义,默认情况下很小。即使变大,“表空间已满”仍然会在更大的查询中发生(诸如大量非表“ Material ”存储在此处,撤消日志,缓存等)。

无论如何,我发现如果您查看存储每张表文件的OS目录,默认情况下是在OSX上使用/ var / lib / mysql,在带有自制程序iirc的/ usr / local / var / mysql上查找,孤立的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文件。

关于mysql - 错误:表xxx的表空间已存在。请在导入之前丢弃表空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15694168/

10-09 00:58