MySQL InnoDB потерял таблицы, но файлы существуют
У меня есть MySQL InnoDB, в котором есть все файлы таблиц базы данных, но MySQL их не видит и не загружает.
Проблема произошла, потому что я удалил эти три файла: ibdata1
, ib_logfile0
а также ib_logfile1
потому что у меня были проблемы с запуском mysql, и я прочитал об их удалении, потому что MySQL просто восстановит их (я знаю, что я должен был их зарезервировать, но не сделал).
Что я могу сделать, чтобы MySQL снова увидел таблицы?
about_member.frm site_stories.frm
about_member.ibd site_stories.ibd
db.opt stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm
FTS_00000000000000bb_CONFIG.ibd story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm
FTS_00000000000000bb_DELETED.ibd story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd
FTS_00000000000000f5_DELETED.ibd story_view_totals.frm
member_favorites.frm story_view_totals.ibd
member_favorites.ibd tags.frm
members.frm tags.ibd
members.ibd
3 ответа
Вот почему 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 и его логи
Попробуйте!
Я обсуждал такие вещи раньше
Apr 23, 2012
: MySQL: как восстановить таблицу, хранящуюся в.frm и.ibd файле?Sep 28, 2011
: Как восстановить таблицу InnoDB, файлы которой были перемещены
ПРЕДОСТЕРЕЖЕНИЕ
Что делать, если вы не знаете структуру таблицы tags
?
Существуют инструменты для получения оператора CREATE TABLE, просто используя .frm
файл. Я также написал пост об этом: Как извлечь схему таблицы только из файла.frm?, В этом посте я скопировал файл.frm на компьютер с Windows из коробки Linux, запустил инструмент Windows и получил CREATE TABLE
заявление.
У меня такая же ситуация, не могу сбросить или создать конкретное имя пользователя. Моя процедура исправления:
Стоп MySQL.
service mysql stop
Удалите ib_logfile0 и ib_logfile1.
cd /var/lib/mysql; rm ib_logfile0 ib_logfile1
Удалить файлы tblname. ВНИМАНИЕ: ЭТО ПОСТОЯННО УДАЛИТ ВАШИ ДАННЫЕ
cd /var/lib/mysql/dbname; rm tblname*
Запустите MySQL.
service mysql start
У меня тоже была эта пробема. я удалил ibdata1
случайно и все мои данные были потеряны.
После 1-2 дней поиска в Google и SO, наконец, я нашел решение, которое спасло мне жизнь (у меня было так много баз данных и таблиц с огромными записями).
взять резервную копию от
/var/lib/mysql
восстановить схему таблицы из
.frm
файл с dbsake (был другой вариант! mysqlfrm. но у меня он не работал)
dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
создать новую таблицу (с новым именем) с экспортированной схемой.
сбросить новые данные таблицы с помощью этой команды:
ALTER TABLE `tbl-new` DISCARD TABLESPACE;
- скопируйте данные старой таблицы и вставьте ее вместо новой и установите для нее правильное разрешение.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
- импортировать данные в новую таблицу.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
- хорошо! у нас есть данные в новой таблице, и мы можем удалить старую.
DROP TABLE `tbl`;
- проверять
/var/lib/mysql/database-name
и если есть данные (.ibd
файл) для старой таблицы, удалите ее.
rm tbl.ibd
- и наконец переименуйте новую таблицу в оригинальное имя
ALTER TABLE `tbl-new` RENAME `tbl`;