MySQL InnoDB потерял таблицы, но файлы существуют

110817
Get Off My Lawn

У меня есть 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 
28
Вы пытались восстановить эти файлы? Файлы журнала могут оставаться удаленными. Вы действительно не должны были удалять ibdata1 Ramhound 10 лет назад 0
Я скопировал файл из старой версии MySQL, где файл находился, но таблицы не отображаются. Get Off My Lawn 10 лет назад 0

2 ответа на вопрос

30
RolandoMySQLDBA

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

InnoDB Architecture

Перемещение таблиц 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утверждение.

Спасибо за отличный ответ! Я все еще нахожусь в процессе импорта одной таблицы, потому что я продолжаю создавать проблемы, но я доберусь до этого в конечном счете, и я сообщу вам, как это работает! Спасибо! Get Off My Lawn 10 лет назад 0
Когда я запускаю команду create, я получаю: ** ОШИБКА 1813 (HY000): существует табличное пространство для таблицы «weblyize» .tags`. Пожалуйста, УДАЛИТЕ табличное пространство перед ИМПОРТОМ. ** Итак, я сначала пытаюсь запустить alter tablespace и получаю эту ошибку: ** ОШИБКА 1146 (42S02): Таблица 'weblyize.tags' не существует **. Что я могу сделать? Get Off My Lawn 10 лет назад 1
Спасибо! Чтобы исправить мою ошибку, я создал новую базу данных, запустил `CREATE TABLE ...` и следовал вашим шагам! Вы избавили меня от необходимости переписывать их на 100% с нуля! Он не импортировал внешние ключи, но это нормально, я могу сделать это сам! Еще раз спасибо! Get Off My Lawn 10 лет назад 0
Что делать, если у меня есть 100 таблиц, которые должны быть исправлены таким образом. Я не буду делать операции для каждой таблицы руками. Как это можно автоматизировать? Oleg Abrazhaev 7 лет назад 0
спасибо, что эти команды Discard / Import tablespace сохранили мои данные! Xipan Xiao 6 лет назад 0
9
user293871

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

  1. Стоп MySQL.

    service mysql stop 
  2. Удалите ib_logfile0 и ib_logfile1.

    cd /var/lib/mysql; rm ib_logfile0 ib_logfile1 
  3. Удалить файлы tblname. ВНИМАНИЕ: ЭТО ПОСТОЯННО УДАЛИТ ВАШИ ДАННЫЕ

    cd /var/lib/mysql/dbname; rm tblname* 
  4. Запустите MySQL.

    service mysql start 
Спасибо, это решило мою проблему, я не делал шаг 3, я просто удалил файлы журналов и запустил mysql. Jeff Wilbert 9 лет назад 1
Вы абсолютно фантастичны! Решил мою проблему. Alex G.P. 7 лет назад 0