Ось чому 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:
RENAME TABLE db1.tbl_name TO 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 немає запису, що не ввімкнено.
Purge видалив усі записи, позначені видаленням, з індексу .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
заяву.