2013-11-13 14:52:59 +0000 2013-11-13 14:52:59 +0000
33
33

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)

36
36
36
2013-11-14 15:34:22 +0000

Вот почему MySQL не может увидеть эти файлы: Системное табличное пространство (ibdata1) имеет специальный словарь данных Storagee-Engine, который позволяет InnoDB отобразить потенциальное использование таблиц:

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

Перемещение таблиц InnoDB из одного места в другое требует таких команд, как

ALTER TABLE mydb.tags DISCARD TABLESPACE;

Здесь приведена часть Документация по MySQL 5.5 с объяснением того, что следует считать

Соображения по переносу для файлов .ibd

Вы не можете свободно перемещать файлы .ibd между каталогами баз данных, как вы можете это сделать с файлами таблиц MyISAM. Определение таблицы, хранящейся в общем табличном пространстве InnoDB, включает в себя имя базы данных. Идентификаторы транзакций и номера последовательностей журналов, хранящиеся в файлах табличного пространства, также различаются между базами данных.

Для перемещения файла .ibd и связанной с ним таблицы из одной БД в другую используйте оператор ТАБЛИЦА РЕНЕЙМА:

ТАБЛИЦА ЗАМЕНЫ db1.tbl_Имя К db2.tbl_Имя; Если у вас есть “чистая” резервная копия файла .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

STEP #1

Убедитесь, что у вас есть резервные копии этих файлов .frm и .ibd в файлах /tmp/innodb_data

STEP #2

Получите оператор CREATE TABLE tags и запустите его как CREATE TABLE mydb.tags .... Убедитесь, что это та же самая структура, что и оригинальная tags.frm

STEP #3

Удалите пустые tags.ibd с помощью MySQL

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

STEP #4

Принесите резервную копию tags.ibd .
ALTER TABLE mydb.tags IMPORT TABLESPACE;

STEP #5

Добавить tags таблицу в словарь данных InnoDB

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

STEP 6

Тест на доступность таблицы

Если вы получите нормальный результат, вы получите его, поздравляю вас с импортом таблицы InnoDB.

Шаг 7

В будущем, пожалуйста, не удаляйте ibdata1 и его журналы

Попробуйте !!!!

Я обсуждал подобные вещи раньше

CAVEAT

Что, если вы не знаете структуру таблиц tags ?

Есть инструменты для получения оператора CREATE TABLE только с помощью файла .frm. Я также написал сообщение : Как извлечь схему таблицы только из файла .frm? . В этой заметке я скопировал файл .frm на машину под управлением Windows из Linux, запустил утилиту Windows и получил оператор CREATE TABLE.

10
10
10
2014-01-28 02:08:22 +0000

У меня та же ситуация, Не могу бросить или создать определенное tblname. Моя процедура исправления:

  1. остановить MySQL.

  2. Удалить ib_logfile0 и ib_logfile1.

  3. Удалить tblname файлы. ПРЕДУПРЕЖДЕНИЕ: ДАННЫЕ будут удалены 0x2 и 0x2 и 4. Запустите MySQL.

2
2
2
2019-03-27 11:19:13 +0000

У меня тоже была эта проблема. Я случайно удалил ibdata1 и все мои данные были потеряны.

После 1-2 дней поиска в Google и SO, наконец, я нашел решение, которое спасло мне жизнь (у меня было так много баз данных и таблиц с огромными записями).

  1. сделайте резервную копию из /var/lib/mysql

  2. восстановите схему таблиц из файла .frm с помощью dbsake (был еще один вариант! mysqlfrm. но он мне не помог)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. создайте новую таблицу (с новым именем) с экспортированной схемой.

  2. отбрасываем новые данные таблицы этой командой:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. скопируйте данные старой таблицы, вставьте их вместо новой и установите для них права доступа.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. импортировать данные в новую таблицу.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. Хорошо! у нас есть данные в новой таблице и мы можем сбросить старую.
DROP TABLE `tbl`;
  1. проверьте /var/lib/mysql/database-name и если есть данные (.ibd файл) для старой таблицы, удалите их.
rm tbl.ibd
  1. и, наконец, переименуйте новую таблицу в оригинальное имя
ALTER TABLE `tbl-new` RENAME `tbl`;
```.