Я создал тестовую таблицу:
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)