Восстановление таблиц MySQL из файлов .ibd, .frm и mysqllogbin

10

По какой-то причине, когда я пытаюсь открыть свои таблицы, которые хранятся в файлах .frmи .ibdфайлах (будь то в MySQL или phpmyadmin), это вызывает синтаксическую ошибку или говорит, что ее не существует.

Я читал другой пост, у которого была похожая проблема, но я не знаю, как проверить, innodb_file_per_tableвключен ли он, и я в целом просто очень запутался. Я также преобразовал копию моего mysql-bin.000002файла в текстовый файл, чтобы увидеть, что данные из моей базы данных не полностью потеряны.

База данных была создана в прошлом году. У меня есть 6 таких mysql-bin.00000файлов, но по некоторым причинам они .000002самые большие. Прямо сейчас, у меня есть .ibdи .frmфайлы для всех моих баз данных, но я в недоумении, как я могу восстановить его обратно в MySQL, или , по крайней мере , в чем - то я могу читать.

Я использую WampServer 2.4 и MySQL 5.6.12 на Windows 2003 Server. Кроме того, я должен загрузить плагин в InnoDB?

carment
источник
Нет, он был создан в прошлом году. У меня есть 6 из этих файлов mysql-bin.00000, но по какой-то причине .000002 является самым большим. Прямо сейчас у меня есть файлы .ibd и .frm для всех моих баз данных, но я не знаю, как восстановить их обратно в MySQL или, по крайней мере, в то, что я могу прочитать.
carment

Ответы:

19

Я наконец понял и решил свою проблему путем множества проб и ошибок. Для тех, у кого нет оригинального файла ibdata1, а есть только файлы .frm и .ibd, вот как я восстановил свои данные.

  1. Загрузите и установите утилиты MySQL по адресу -> http://dev.mysql.com/downloads/utilities .
  2. Зайдите в свою команду / терминал, чтобы открыть утилиту MySQL, mysqlfrm, и используйте ее, чтобы найти структуру вашей таблицы, которую вам нужно восстановить. Как я это сделал, я перешел в расположение файла mysqlfrm, а затем ввел "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". Файл .txt должен быть сохранен в той же папке, где хранятся ваши утилиты, если вы не указали, куда вы хотите его поместить.
  3. В текстовом файле вы увидите операторы CREATE TABLE, которые включают все столбцы и информацию (в основном, исходную структуру) вашей таблицы. Скопируйте этот оператор CREATE со всей этой информацией.
  4. В вашей команде MySQL создайте новую базу данных (CREATE DATABASE database_name). Сделайте это то же самое имя как ваше оригинальное имя базы данных.
  5. Создайте новую таблицу внутри новой базы данных - она ​​не должна совпадать с именем папки. Вы можете создать новую таблицу в командной строке, но я создал свою таблицу в PhpMyAdmin, бесплатном программном инструменте, который управляет администрированием MySQL через Интернет. Я просто нажал на базу данных на PhpMyAdmin, затем на таблицу SQL, и вставил структуру таблицы из # 3. (Как примечание, я всегда получал ошибки, если я назвал свои таблицы "table" в моей командной строке, поэтому старайтесь избегать этого имени).
  6. В своей команде MySQL войдите в свою базу данных и введите «ALTER TABLE table_name DISCARD TABLESPACE», что по существу удалит файл этой таблицы .ibd.
  7. Скопируйте файл .ibd вашей исходной таблицы (таблицы, которую вы хотите восстановить) во вновь созданную таблицу, чтобы заменить только что удаленный файл .ibd. Измените исходный файл .ibd на имя только что созданной таблицы. Это будет имитировать старый файл .ibd, который вы только что удалили. Вы можете найти эту папку в папке данных MySQL, в только что созданной папке базы данных на вашем компьютере.
  8. Вернитесь к своей команде MySQL, войдите в базу данных и введите «ALTER TABLE table_Name IMPORT TABLESPACE». Вы получите предупреждение типа «error» (1), но просто проигнорируйте его.
  9. И сделано! если вы пытаетесь получить доступ к новой таблице, она должна содержать все данные из вашей старой таблицы.

Я надеюсь, что это помогло, и дайте мне знать, если у вас есть какие-либо вопросы или комментарии! Кроме того, проверьте http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file для других деталей.

carment
источник
Отличная инструкция, но она работает только с MySQL 5.6 ! На 5.5 вы получите ошибку Got error -1 from storage engineпри запуске IMPORT TABLESPACE. Но для меня MySQL 5.6 работал для таблиц, которые были созданы с использованием MySQL 5.5, так что все хорошо;). Если вы застряли с 5.5, вы должны следовать инструкциям в приведенной вами ссылке chriscalender .
Острокач
@carment Я следовал вашим инструкциям, но столкнулся с ошибкой ERRPR: попытка получить доступ к номеру страницы 1767006713 в пространстве 13635, имя пространства <dbname> / <tblname>, которое выходит за пределы табличного пространства. Можете ли вы указать мне, что я мог сделать?
Мохит Мехта
Это просто сэкономило мне время на воссоздание стола. Метод все еще работает в 2016 году, на MySQL 5.7.17
Энди Мерсер
@ostrokach, кажется, это потому, что вы не innodb_file_per_tableвключили.
Иван
Ты просто .. спас меня после очень долгого путешествия, спасибо!
Amr SubZero
4

Основной файл данных InnoDB - обычно называемый ibdata- необходим для того, чтобы MySQL мог понимать ваши файлы .ibd.

Если вам нужно перемещать данные между серверами, используя двоичные файлы, вам следует аккуратно остановить MySQL, а затем переместить все файлы данных, включая файлы ibdata , между каталогами.

Более надежным механизмом перемещения данных между серверами в Windows будет использование ( mysqldump) или экспорт базы данных из PHPMyAdmin (или аналогичного инструмента).

Если бинарное ведение журнала было включено все время работы вашего сервера (на основании комментариев это может быть не так), вы также можете использовать mysqlbinlogдля восстановления каждого оператора SQL, который вы выполняли на сервере, из файлов mysql-bin и таким образом воссоздать базу данных. В файлах mysql-bin должны быть метки времени Unix, которые помогут вам определить, насколько далеко они зашли.

Если вы потеряли исходные файлы базы данных и все, что у вас осталось, это отдельные файлы .ibd, вам, возможно, придется прибегнуть к восстановлению данных в соответствии с рекомендациями Акузминского в комментариях.

MySQL 5.6 имеет некоторые новые функции для перемещения файлов данных InnoDB .ibd ( переносимые табличные пространства ), но они требуют определенных усилий, и для достаточно небольшой базы данных будет гораздо проще передавать данные с помощью mysqldump.

Натан Джолли
источник
0

Wiki ответ, полученный из комментариев к вопросу от akuzminsky


Если вы видите *.ibdфайлы, то innodb_file_per_tableесть ON, иначе все таблицы будут в ibdata1.

Если он говорит, что таблица не существует, то таблица отсутствует в словаре InnoDB. Попробуйте свалить все таблицы в отдельные дампы sql (одна таблица - один файл). Те таблицы, которые вы не можете сбросить, вы можете восстановить с помощью TwinDB .

Бинарных пакетов пока нет. Вы должны получить исходный код из GitHub и скомпилировать его. См. Инструкции в словаре Recover InnoDB . Это довольно просто:

git clone git@github.com:twindb/undrop-for-innodb.git

а потом

make all
Paul White
источник