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

33

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

Ответы:

36

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

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заявление.

RolandoMySQLDBA
источник
Спасибо за отличный ответ! Я все еще нахожусь в процессе импорта одной таблицы, потому что я продолжаю создавать проблемы, но я доберусь до этого в конечном итоге, и я дам вам знать, как это работает! Благодарность!
Сойди с моей лужайки
1
Когда я запускаю команду create, я получаю: ERROR 1813 (HY000): табличное пространство для таблицы ' weblyize. tags' существует. Пожалуйста, отмените табличное пространство перед импортом. Итак, сначала я пытаюсь запустить alter tablespace и получаю эту ошибку: ОШИБКА 1146 (42S02): Таблица 'weblyize.tags' не существует . Что я могу сделать?
Сойди с моей лужайки
Благодарность! Чтобы исправить мою ошибку, я создал новую базу данных, запустил и CREATE TABLE ...следовал вашим шагам! Вы избавили меня от необходимости переписывать их на 100% с нуля! Он не импортировал внешние ключи, но это нормально, я могу сделать это сам! Еще раз спасибо!
Сойди с моей лужайки
Что делать, если у меня есть 100 таблиц, которые должны быть исправлены таким образом. Я не буду делать операции для каждой таблицы руками. Как это можно автоматизировать?
Олег Абражаев,
10

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

  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
    
user293871
источник
1
Спасибо, это решило мою проблему, я не сделал шаг 3, я просто удалил файлы журналов и запустил mysql.
Джефф Уилберт
Вы абсолютно фантастичны! Решил мою проблему.
Alex GP
2

У меня тоже была эта пробема. Я удалил 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`;
mostafaznv
источник