我是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服务器,或者也许用户权限可能与此有关,但我只是在这里假设。
在这里有点晚了,但通常我看到这个问题发生在当你在'innodb_file_per_table'模式下运行时得到一个'表空间满的错误。 在此不做过多赘述(更多信息见这里),数据库服务器的表空间是由innodb_data_file_path设置定义的,默认是相当小的。 即使做得更大,在大型查询等情况下,仍然会出现表空间满的情况(很多非表的东西都存储在里面,撤销日志、缓存等等...)。
总之,我发现,如果你在操作系统的目录中寻找每张表的文件,OSX上默认为/var/lib/mysql,在homebrew上为/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,然后做同样的四个步骤,如下所示:
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的"gotcha's"恢复过程中,甚至是文件传输时更有信心。