缺少.frm和.idb文件,无法删除表

问题描述 投票:-1回答:1

我有一个奇怪的场景,技术人员从我的一台服务器上删除了一个表的.frm和.idb文件,幸运的是,这是一个非关键表。我正在尝试重新创建表,但是当尝试使用CREATE TABLE,DROP TABLE或ALTER TABLE时,表空间仍然存在,这会导致错误。我真的无法将好的表移至新的架构,删除旧的架构,然后以这种方式重新创建该表,因为架构中仍然存在无法脱机的关键表。关于如何摆脱此“损坏”表的任何想法?

mysql database innodb
1个回答
1
投票

我创建了一个测试表:

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)
© www.soinside.com 2019 - 2024. All rights reserved.