mysql - невозможно удалить таблицу, так как она не существует, невозможно создать таблицу, так как она существует

mysql - невозможно удалить таблицу, так как она не существует, невозможно создать таблицу, так как она существует

После сбоя сервера у нас возникли очень странные проблемы с одной конкретной ссылкой на таблицу.

При выборе восстановления из резервной копии база данных была удалена, и загружен резервный дамп SQL, но при создании таблицы возникает cache_contentошибка «таблица уже существует».

mysql> create table cache_content( id int NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ERROR 1005 (HY000): Can't create table '****.cache_content' (errno: -1) mysql> drop table cache_content; ERROR 1051 (42S02): Unknown table 'cache_content'

Как ни странно, таблица удаления удалила файл .frm, но не файл .ibd (если он существует), таблица создания создаст файл .ibd, но не файл .frm.

Я перепробовал множество методов восстановления, включая импорт дампа в новую базу данных (все прошло без проблем), завершение работы MySQL и копирование соответствующих файлов .frm и .ibd, а затем использованиеidbconnectчтобы попытаться прикрепить эту «заведомо хорошую» версию:

... Space id: 1952673645 (0x74636F6D) Next record at offset: 74 TABLE_ID of `****/`.`cache_content` can not be 0 ...

Проверяя связанные таблицы в information_schema, я вижу, что это так, и TABLESPACE присвоено значение 0

mysql> select * from INNODB_SYS_TABLES where `SCHEMA`="*****";
+----------+--------+--------------------------+------+--------+-------+
| TABLE_ID | SCHEMA | NAME                     | FLAG | N_COLS | SPACE |
+----------+--------+--------------------------+------+--------+-------+
...

|    19791 | *****  | cache_content            |    1 |      9 |     0 |
+----------+--------+--------------------------+------+--------+-------+
N rows in set (0.01 sec)

mysql> select * FROM INNODB_SYS_INDEXES where TABLE_ID=19791;
+----------+--------+----------+------+----------+---------+-------+
| INDEX_ID | NAME   | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+--------+----------+------+----------+---------+-------+
|     7919 | expire |    19791 |    0 |        1 |  311158 |     0 |
+----------+--------+----------+------+----------+---------+-------+
1 row in set (0.00 sec)

Версия сервера: Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64

Теперь, основываясь на прочитанном, я почти уверен, что удаление ibdata1 ib_logfile* может быть единственным способом очистки этой «призрачной» ссылки.

Мой вопрос: есть ли способ очистить эти фантомные ссылки, чтобы можно было восстановить таблицу из резервной копии?

решение1

В конце концов я решил восстановить все базы данных из резервных копий,

  1. mysqldump --all-databases --triggers > /path/to/dumpfile.sql
  2. service mysql shutdown
  3. rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
  4. iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
  5. mysql_install_db --datadir=/path/to/datadir
  6. mysql < /path/to/dumpfile.sql
  7. Удалить и восстановить любые базы данных, которые не были целы во время 1. из отдельных резервных копий.
  8. service mysql restart && service iptables restart

Я оставлю этот ответ здесь, а вопрос непринятым на следующую неделю; я надеюськто-томожет предоставить решение, при котором не требуется перестраивать все ibdata.

Связанный контент