Отсутствуют файлы .frm и .idb, невозможно удалить таблицу - PullRequest
0 голосов
/ 23 января 2020

У меня есть странный сценарий, когда технический специалист удалил файлы .frm и .idb для таблицы с одного из моих серверов, к счастью, это была некритическая таблица. Я пытаюсь воссоздать таблицу, однако при попытке использовать CREATE TABLE, DROP TABLE или ALTER TABLE я получаю ошибки, потому что табличное пространство все еще существует. Я не могу переместить хорошие таблицы в новую схему, удалить старую схему, а затем воссоздать таблицу таким образом, поскольку в схеме все еще есть критические таблицы, которые нельзя перевести в автономный режим. Есть мысли о том, как мне избавиться от этой "сломанной" таблицы?

1 Ответ

1 голос
/ 27 января 2020

Я создал тестовую таблицу:

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.*

Сейчас У меня сложная ситуация:

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, файл табличного пространства .ibd все еще существует, даже если я отсоединил его от каталога данных!

В любом случае, теперь я могу удалить таблицу. Это удаляет .frm и .ibd И , закрывает для них файловые дескрипторы, поэтому они действительно удаляются из файловой системы.

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)
...