Вот почему MySQL не может видеть эти файлы: Системное табличное пространство (ibdata1) имеет специальный словарь данных для Storage-Engine, который позволяет InnoDB отображать потенциальное использование таблицы:
Перемещение таблиц InnoDB из одного места в другое требует таких команд, как
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Вот часть документации MySQL 5.5, объясняющая, что нужно учитывать
Вопросы переносимости файлов .ibd
Вы не можете свободно перемещать файлы .ibd между каталогами базы данных, как это можно делать с помощью файлов таблиц MyISAM. Определение таблицы, хранящееся в общем табличном пространстве InnoDB, включает имя базы данных. Идентификаторы транзакций и порядковые номера журналов, хранящиеся в файлах табличных пространств, также различаются в разных базах данных.
Чтобы переместить файл .ibd и связанную таблицу из одной базы данных в другую, используйте инструкцию RENAME TABLE:
Переименовать таблицу db1.tbl_name в db2.tbl_name; Если у вас есть «чистая» резервная копия файла .ibd, вы можете восстановить его до установки MySQL, из которой он был создан, следующим образом:
Таблица не должна быть удалена или усечена с тех пор, как вы скопировали файл .ibd, поскольку при этом изменяется идентификатор таблицы, хранящийся в табличном пространстве.
Выполните эту инструкцию ALTER TABLE, чтобы удалить текущий файл .ibd:
ALTER TABLE tbl_name DISCARD TABLESPACE; Скопируйте резервный файл .ibd в соответствующий каталог базы данных.
Выполните эту инструкцию ALTER TABLE, чтобы указать InnoDB использовать новый файл .ibd для таблицы:
ALTER TABLE tbl_name IMPORT TABLESPACE; В этом контексте «чистая» резервная копия файла .ibd - это та, для которой выполняются следующие требования:
В файле .ibd нет незавершенных изменений транзакциями.
В файле .ibd нет записей без буфера вставки.
Очистка удалила все записи индекса, помеченные на удаление, из файла .ibd.
mysqld сбросил все измененные страницы файла .ibd из пула буферов в файл.
Учитывая эти предостережения и протоколы, вот рекомендуемый порядок действий
Для этого примера давайте попробуем восстановить таблицу tags
в базе данных mydb
ШАГ 1
Убедитесь, что у вас есть резервные копии этих .frm
и .ibd
в /tmp/innodb_data
ШАГ 2
Получить оператор CREATE TABLE tags
и выполнить его как CREATE TABLE mydb.tags ...
Убедитесь, что это та же структура, что и в оригинальном tags.frm
ШАГ 3
Удалите пустой tags.ibd
используя MySQL
ALTER TABLE mydb.tags DISCARD TABLESPACE;
ШАГ № 4
Принесите резервную копию tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
ШАГ № 5
Добавить таблицу tags
в словарь данных InnoDB
ALTER TABLE mydb.tags IMPORT TABLESPACE;
ШАГ 6
Проверьте доступность таблицы
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Если вы получаете нормальные результаты, поздравляем вас с импортированием таблицы InnoDB.
ШАГ 7
В будущем, пожалуйста, не удаляйте ibdata1 и его логи
Попробуйте!
Я обсуждал такие вещи раньше
ПРЕДОСТЕРЕЖЕНИЕ
Что делать, если вы не знаете структуру таблицы tags
?
Существуют инструменты для получения оператора CREATE TABLE, просто используя файл .frm
. Я также написал пост об этом: Как извлечь схему таблицы только из файла .frm? , В этом посте я скопировал файл .frm на компьютер с Windows из коробки Linux, запустил инструмент Windows и получил инструкцию CREATE TABLE
.