После сбоя сервера у нас возникают очень странные проблемы с одной конкретной ссылкой на таблицу.
При выборе восстановления из резервной копии база данных была удалена и загружен резервный дамп 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 * может быть единственным способом избавиться от этой «призрачной» ссылки.
Мой вопрос: есть ли способ удалить эти призрачные ссылки, чтобы разрешить восстановление таблицы из резервной копии?
В итоге я решил восстановить все базы данных из резервных копий,
mysqldump --all-databases --triggers > /path/to/dumpfile.sql
service mysql shutdown
rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
mysql_install_db --datadir=/path/to/datadir
mysql < /path/to/dumpfile.sql
service mysql restart && service iptables restart
Я оставляю этот ответ здесь и вопрос без ответа на следующую неделю; Я надеюсь кто то может предоставить решение, при котором не нужно перестраивать всю ibdata.