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

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

引入问题

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

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

1

出现这个问题的大部分原因,在使用 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 的作用会在后续的文章进行讨论。如果您的问题还没有解决,可以联系作者,作者很乐意帮忙。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

历史上的今天:03月29日

热门专题

云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
云南综合高中|云南综合高中
云南综合高中
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
云南高职单招|云南单招,云南单招网,云南高职单招网,云南高职单招,云南单招学校,云南单招培训
云南高职单招

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部