MySQL数据库的InnoDB引擎TableSpaceExists问题解决

在这里插入图片描述

文章中所有操作均是在 MySQL 5.7 版本下进行的

引入问题

MySQL 使用过程中如果出现如下报错:

ERROR 1813 (HY000): Tablespace ‘`库名`.`表名`‘ exists.

出现这个问题的大部分原因,在使用 InnoDB 引擎的数据库中,所有已经存在的表都使在使用 InnoDB 引擎的数据库中,所有已经存在的表都使用两个文件保存。假设表名为 test1,则在数据库的数据目录下会有两个文件:

  • test1.frm 文件,存储数据表的定义信息
  • test1.ibd 文件,存储数据表的内容

如果上述的 frm 文件某种原因丢失或者损坏,再去操作(比如删除这个表重新创建表"drop table if exists tbl_test;")可能就会报上面的错。

解决问题

第一种办法(适用于 MySQL 5.6 及以前的版本)

先关闭 MySQL 的数据库服务,找到 MySQL 的安装目录下的 data 目录,找到报错的对应的库的目录进去,对应的表的 .ibd 文件直接删掉,重启服务即可。

第二种办法(适用于 MySQL 5.6 及以前的版本)

第一种办法不好使?在 MySQL 5.6 及以前的版本,这些文件都是可以公用的。创建一个临时的库(库名自己定),在这个库下面建立一个完全相同的表。关掉 MySQL 的数据库服务,找到 MySQL 的安装目录下的 data 目录下刚才创建的那个临时库的目录,进入找到 .frm 文件和 .ibd 文件,拷贝这两个文件到报错的那个库的目录中覆盖粘贴即可,这样就可以进行正常操作。

MySQL 5.7 版本的解决办法

MySQL 5.7 之后因为数据库会默认使用表空间隔离,所以上面的第二种办法就不好使了,因为这个时候怎么创建临时的库和相同名的表,它们的 .frm 和 .ibd 这两个文件并不能通用。第一种直接删除然而从新创建相同表还是会报错。那如何解决呢?其实还是利用第二种办法的原理。

  • 先关闭 MySQL 的数据库服务,删除掉报错的那个表的老的 .ibd 文件,比如 test1.ibd。
  • 修改 my.ini 文件(Linux 系统自行对应 my.cnf),修改 innodb_file_per_table=0,如果没有在最后面添加即可,保存文件,重启数据库服务。
  • 新建一个临时的库(库名随便取,比如 testdb),并创建一个同名的表,比如上面的假设表为 test1。这时候会在这个临时的库(testdb)的目录下出现这个表的 .frm 文件,比如 test1.frm。将这个文件拷贝到报错的数据库目录下覆盖粘贴即可。回到之前报错的库删除或重建这个表就不会报错了。
  • 最后不要忘了把修改的 innodb_file_per_table=0 换成 innodb_file_per_table=1 ,或者直接屏蔽或删除掉,保存重启数据库服务。

结语

关于 innodb_file_per_table 的作用会在后续的文章进行讨论。如果您的问题还没有解决,可以联系作者,作者很乐意帮忙。

你可能感兴趣的:(MySQL,mysql,数据库)