我有一个奇怪的场景,技术人员从我的一台服务器上删除了一个表的.frm和.idb文件,幸运的是,这是一个非关键表。我正在尝试重新创建表,但是当尝试使用CREATE TABLE,DROP TABLE或ALTER TABLE时,表空间仍然存在,这会导致错误。我真的无法将好的表移至新的架构,删除旧的架构,然后以这种方式重新创建该表,因为架构中仍然存在无法脱机的关键表。关于如何摆脱此“损坏”表的任何想法?
我创建了一个测试表:
mysql> use test;
mysql> create table test ( id serial primary key );
mysql> insert into test () values ();
检查文件是否存在于我的数据目录中:
$ cd /usr/local/var/mysql/test
$ ls
db.opt test.frm test.ibd
做不可思议的事!
$ rm test.*
现在我有22个局面:
mysql> show tables;
Empty set (0.00 sec)
mysql> create table test (id serial primary key);
ERROR 1050 (42S01): Table 'test' already exists
mysql> drop table test;
ERROR 1051 (42S02): Unknown table 'test.test'
该怎么办?
mysql> create schema recovery;
mysql> create table recovery.test ( id serial primary key );
mysql> system cp /usr/local/var/mysql/recovery/test.frm /usr/local/var/mysql/test/
.frm
文件在MySQL 5.x中存储表元数据。现在我有了一个.frm
文件,MySQL让我查询该表。
mysql> select * from test;
+----+
| id |
+----+
| 1 |
+----+
这很有趣-它如何知道那一行数据?我不是rm
.ibd
文件吗?
答案:当进程仍具有打开的文件句柄时,文件并未真正删除。由于我还没有重新启动MySQL Server进程,因此.ibd
表空间文件仍然存在,即使我已将其从datadir取消链接!
无论如何,我现在可以放下桌子。这将删除.frm
,并且.ibd
AND将关闭它们的文件句柄,因此它们实际上已从文件系统中删除。
mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)
最后,我现在可以创建一个具有相同名称的新表,即使具有不同的列。
mysql> create table test ( bar int primary key );
Query OK, 0 rows affected (0.02 sec)