29

У меня есть 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

2 ответа2

32

Вот почему 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 .

9

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

  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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .