数据库报错:
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
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 ,使用独立表空间的默认设置。