问题描述
曾遇到创建数据表报错问题,报错如下:
ERROR 1005 (HY000) at line 18: Can't create table 'db1.t2' (errno: 121)
通过日志查看有一条记录
InnoDB: Error: table `db1`.`t2` already exists in InnoDB internal
可见要创建的这个表已经存在,导致创建同名数据表报错,但是从数据库目录上查看确实没有这个表文件。
原因分析
事实上,导致这种情况是由于删除数据表时直接删除了源文件,而没有通过SQL命令来删除。这种错误的方法对MyISAM引擎的数据库有时候是管用的,但是对于InnoDB引擎的数据库则是一定不管用的。
因为对于InnoDB引擎的数据库,当创建一个表时,会在数据库目录中创建一个.frm格式(如t2.frm)的表结构文件,同时,内部地,InnoDB会为这个表向自己的数据目录添加一个条目。当把源文件(t2.frm)直接删除时,InnoDB内部数据目录中并没有删除对应的条目。
这时,你运行show tables,由于该命令是通过表结构文件检索的,自然查看不到这个表。
如果尝试重新导入数据,由于.sql文件中的语句写的是"drop table if exists 't2'",最终也会因查不到表而不去执行drop命令。
处理方法
1. 对于MyISAM引擎的数据库
如果之前删的表文件是空表文件,则可以直接create创建(这种情况不会出现上面的报错;如果之前删的是有数据的表文件,则直接创建是不管用的,需要先执行"drop table 表名",然后再重新创建该表即可。
2. 对于InnoDB引擎的数据库
可以先尝试执行"drop table 表名",然后再重新创建该表;如果仍有问题,则需要创建一个临时数据库,在临时数据库中创建一个同名数据表,然后将该表文件(只有一个.frm文件)复制到当前的数据库中,赋予mysql权限,然后再执行"drop table 表名",再重新创建该表即可。