Восстановить базу данных MySQL из папки данных без ibdata1 из файлов ibd

15

Мой каталог WAMP был случайно удален другим пользователем. Доступна только папка данных в MySQL. И, при этом, доступны только папки базы данных (папки в «\ bin \ mysql \ mysql5.6.12 \ data \» с именами баз данных). Все файлы, включая « ibdata1 » в корне «\ bin \ mysql \ mysql5.6.12 \ data \», также будут удалены.

Папки базы данных содержат файлы только с расширениями ниже.

* .frm, * .ibd

и файл "db.opt".

Как восстановить базы данных?

Я уже пытался восстановить bdata1. Но не смог вернуть его. И, некоторые базы данных также содержат MYISAM.

cyberwani
источник

Ответы:

16

MyISAM

Для таблицы MyISAM mydb.mytable у вас должно быть три файла

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Они уже должны быть доступны в виде таблицы, поскольку каждый файл содержит необходимые данные, метаданные и информацию индекса. В совокупности они образуют таблицу. Нет никаких механизмов доступа к внешнему хранилищу.

InnoDB

Взгляните на это графическое представление InnoDB

InnoDB Архитектура

Единственное, что прикрепляет ibdata1 к .ibdфайлам, это словарь данных.

Ваша миссия, если вы решите принять ее, состоит в том, чтобы создать каждую таблицу и поменять местами .ibd

Прежде чем что-либо делать, сделайте полную копию "\ bin \ mysql \ mysql5.6.12 \ data" в другой

Вот образец

Предположим, у вас есть база данных mydbс таблицей mytable. Это означает

  • У вас есть папка \bin\mysql\mysql5.6.12\data\mydb
  • Внутри этой папки у вас есть
    • mytable.frm
    • mytable.ibd

Вам нужно .frm. Если вы посмотрите на мой пост Как извлечь схему таблицы только из файла .frm? Вы можете скачать утилиту MySQL, которая может генерировать SQL, необходимый для создания таблицы.

Теперь вы должны сделать следующее

  • Переместить mytable.ibdв\bin\mysql\mysql5.6.12\data
  • Запустите SQL для создания таблицы InnoDB
  • Войдите в MySQL и запустите ALTER TABLE mydb.mytable DISCARD TABLESPACE;(это удалит \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Скопировать \bin\mysql\mysql5.6.12\data\mytable.ibdв\bin\mysql\mysql5.6.12\data\mydb
  • Войдите в MySQL и запустите ALTER TABLE mydb.mytable IMPORT TABLESPACE;(это будет зарегистрирован \bin\mysql\mysql5.6.12\data\mydb\mytable.ibdв словаре данных)

После этого таблица mydb.mytableдолжна быть полностью доступна. Вы можете проверить эту доступность, просто запустив:

SELECT * FROM mydb.mytable LIMIT 10;

Попробуйте!

НАПИТКА (Восстановление данных включает в себя необходимые знания) Ответственно

RolandoMySQLDBA
источник
Чтобы завершить этот замечательный ответ, для innodb вам нужно будет удалить все ограничения FK, которые ссылаются на таблицу, прежде чем отбрасывать ее табличное пространство. После импорта вы должны воссоздать FK.
SebaGra
после импорта табличного пространства information_schema.key_column_usage(возможно, и другие таблицы) не вернут первые данные, selectпоэтому вам нужно выполнить хотя бы один запрос и подождать несколько секунд, прежде чем следующий запрос сможет работать. (mysql Ver 14.14 Distrib 5.7.19, для linux-glibc2.12 (x86_64) с использованием оболочки EditLine)
user3338098