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 Архитектура

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

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

  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
    

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