InnoDB 数据库引擎TableSpace Exists 问题
我自己的解决方法:
- 关闭数据库
- 删除表里的文件。
- my.ini 文件中添加
innodb_file_per_table=0
- 把数据复制到表里。
- 把my.ini 文件的
innodb_file_per_table=0
改为innodb_file_per_table=1
数据库报错:
ERROR 1813 (HY000): Tablespace 'panda
.t1
' exists.
原因:
在使用InnoDB引擎的数据库中,所有已经存在的表都使用两个文件保存,假设表名为content,则在数据库的数据目录下会有两个文件,
(1).frm 文件 数据表定义信息
(2).ibd 文件 数据表内容
处理方法:
遇到这种事情,最快的方式就是直接重装,但是我们一般不能这样做,重装数据库可不是闹着玩的。如果实在解决不了,大不了这个表名放弃算了。
在 MySql 5.6之前,这些文件都是可以公用的,如果 .frm 文件 丢失,则会报这个错,可以参考下面的博客(http://blog.csdn.net/u011478909/article/details/51589002 ),使用一个临时库,建立一个完全相同的表,然后拷贝这两个文件到丢失的库中,就可以进行正常操作,这种很简单,不再多言。
在MySql 5.6 及以后的版本,就没有这么简单了,因为数据库会默认使用表空间隔离,所以这时候这两个文件并不能通用,导致使用上面的办法并不能生效。
(1)停止 mysql 服务。
(2)使用 select @@datadir 查看Mysql数据文件存储的位置,打开这个位置,找到对应的数据库,发现有这两个文件。
(3)手动删除 .frm 文件,进行测试。这时候奇怪的事情发生了。
[SQL]CREATE TABLE content
(
id INT PRIMARY KEY NOT NULL,
name VARCHAR(64) NOT NULL
);
[Err] 1813 - Tablespace '`blog`.`content`' exists.
[SQL]SELECT * from content;
[Err] 1146 - Table 'blog.content' doesn't exist
按照网上有些大神介绍的方法,关掉mysql服务,直接把 .ibd 文件也删了,重启服务,这样的方法在低版本的mysql可能奏效,但是对于5.6以上的版本根本不行,因为.ibd 文件会自动恢复,然后就回到上面的问题了。原来5.6以上的版本两个文件都添加了index ,不能通用,默认是独立的。而且还会根据 information_schema 库和一些配置文件中的信息,恢复.ibd文件,但是我们还是有方法。
5.6 及以上版本处理方式
(1) 关掉mysql服务,删掉老的 blog.content,idb 文件,找到 my.ini 文件,修改 innodb_file_per_table=0 。重启服务。
(2) 新建一个测试test数据库,并新建一个 test.content 表,这时候data库的data目录只出现了.frm 文件,把这个文件拷贝到blog数据库的目录下。
(3) 这个时候回到blog 库,删掉并新建 content表,不再报错。
(4)网上有人说5.6 以上只能放弃这个表名,但是其实我们可以用这个方式解决问题,最后不要忘了把 my.ini 文件,修改 innodb_file_per_table=1 ,使用独立表空间的默认设置。