Mysql, как восстановить базу данных из файлов ibd и frm

Обновлено: 21.11.2024

Таблицу с табличным пространством, специфичным для таблицы (хранящимся в файле .ibd), можно восстановить отдельно, не отключая сервер MySQL. Этот метод применим, если вы удаляете или обновляете данные таблицы по ошибке, фактически не теряя саму таблицу с помощью инструкции DROP TABLE , TRUNCATE TABLE или DROP DATABASE.

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

Для MySQL 5.5 и более ранних версий таблица уже должна существовать и не должна быть удалена или усечена с момента создания резервной копии. Когда таблица InnoDB усекается или удаляется и создается заново, она получает новый идентификатор таблицы. Любое несоответствие идентификаторов между таблицей в базе данных и таблицей из резервной копии может помешать ее восстановлению. Требование соответствия идентификаторов таблиц также является причиной, по которой вы должны восстанавливать данные на тот же сервер MySQL, с которого поступили данные резервного копирования, а не на другой сервер с аналогичным набором баз данных и таблиц. Это ограничение не применяется к MySQL 5.6 и более поздним версиям, если восстановление выполняется с одной общедоступной (GA) версии на другую в той же серии серверов MySQL.

Запретить операции записи для восстанавливаемой таблицы. Это не позволяет пользователям изменять таблицу во время восстановления.

Выполните эту инструкцию ALTER TABLE:

Внимание! Текущий файл .ibd удаляется.

Скопируйте резервный файл .ibd обратно в соответствующий каталог базы данных.

Выполните эту инструкцию ALTER TABLE:

В этом контексте чистая резервная копия файла .ibd означает:

В файле .ibd нет незафиксированных изменений транзакциями.

В файле .ibd нет необъединенных записей буфера вставки.

Purge удалил все помеченные для удаления индексные записи из файла .ibd.

mysqld сбросил все измененные страницы файла .ibd из пула буферов в файл.

Вы можете создать такой чистый резервный файл .ibd следующим способом:

Остановите все действия с сервера mysqld и зафиксируйте все транзакции.

Подождите, пока SHOW INNODB STATUS не покажет, что в базе данных нет активных транзакций, а состояние основного потока InnoDB — Ожидание активности сервера. Затем вы можете сделать копию файла .ibd.

Еще один способ сделать чистую копию файла .ibd — использовать mysqlbackup :

Используйте mysqlbackup с опцией --only-innodb или --only-innodb-with-frm для резервного копирования установки InnoDB.

Запустите mysqlbackup . apply-log для создания согласованной версии резервной копии базы данных.

Запустите второй (фиктивный) сервер mysqld в резервной копии и дайте ему очистить файлы .ibd в резервной копии. Дождитесь окончания очистки.

Ранее я сохранил копию каталога /var/lib/mysql/ddms ("ddms" — это имя схемы). Теперь я установил новый MySQL на только что установленную Ubuntu 10.04.3 LTS, запустив apt-get install mysql-server , я считаю, что версия 5.1 была установлена. После того, как я скопировал каталог ddms в /var/lib/mysql, некоторые из его таблиц работают нормально, это таблицы с соответствующим набором из трех файлов: файл .frm, файл .MYD и файл .MYI.

Однако есть две таблицы с другим набором файлов: файл .frm и файл .ibd. Эти две таблицы не отображались в списке таблиц в phpMyAdmin. Когда я смотрю журнал ошибок, он говорит:

Пожалуйста, помогите восстановить эти две таблицы. Спасибо.

10 ответов 10

Таблицы InnoDB нельзя копировать так же, как таблицы MyISAM.

Просто копирование файлов .frm и .ibd из одного места в другое вызывает проблемы. Копирование файла .frm и .ibd таблицы InnoDB оправдано только тогда и только тогда, когда вы можете гарантировать, что идентификатор табличного пространства в файле .ibd точно совпадает с записью идентификатора табличного пространства в метаданных файла ibdata1.

Я написал две статьи в DBA StackExchange об этой концепции идентификатора табличного пространства

Вы можете применить предложения из ссылки Криса Календаря или вернуться к старой установке mysql, запустить mysql, а затем mysqldump базы данных ddms. Затем импортируйте этот mysqldump в новый экземпляр mysql. Поверьте мне, это было бы намного проще.

Недавно я столкнулся с такой же проблемой. Вот шаги, которые я использовал для ее решения, не возясь с идентификатором табличного пространства, как упоминает RolandoMySQLDBA выше. У меня Mac, поэтому я использовал MAMP, чтобы восстановить базу данных до такой степени, что я мог экспортировать ее в дамп MySQL.

-.FRM файлы из папки mysql_database

-Свежая установка MAMP/MAMP Pro, которую вы готовы уничтожить (при необходимости)

  1. Подключитесь по SSH к вашему веб-серверу (dev, production, без разницы) и перейдите в папку mysql (моя папка находилась в /var/lib/mysql для установки Plesk в Linux)
  2. Сжать папку mysql
  3. Загрузите архив папки mysql, который должен содержать все базы данных mySQL, будь то MyISAM или innoDB (вы можете удалить этот файл или переместить его в загружаемый каталог, если это необходимо)
  4. Установите MAMP (Mac, Apache, MySQL, PHP)
  5. Перейдите к /Applications/MAMP/db/mysql/
  6. Резервное копирование /Applications/MAMP/db/mysql в zip-архив (на всякий случай)

Скопируйте все папки и файлы, включенные в архив папки mysql, с рабочего сервера (в моем случае это среда mt Plesk), КРОМЕ НЕ ПЕРЕЗАПИСЫВАТЬ:

И вуаля, теперь у вас должен быть доступ к базам данных из phpMyAdmin, какое облегчение!

Скопировано ниже для справки. Обратите внимание, что при установке MAMP по умолчанию используется пароль «root».

Как запустить mysqldump для MAMP с помощью терминала

ЭКСПОРТ БАЗЫ ДАННЫХ ИЗ MAMP[1]

Шаг 1. Откройте новое окно терминала

Шаг второй: перейдите к установке MAMP, введя следующую строку в терминал cd /applications/MAMP/library/bin Нажмите клавишу ввода

Шаг третий: напишите команду дампа ./mysqldump -u [ИМЯ_ПОЛЬЗОВАТЕЛЯ] -p [ИМЯ_БАЗЫ_ДАННЫХ] > [ПУТЬ_К_ФАЙЛУ] Нажмите клавишу ввода

Совет: чтобы быстро перейти к папке, вы можете перетащить папку в окно терминала, и она запишет местоположение папки. Это был великий день, когда кто-то показал мне это.

Шаг четвертый. Эта строка текста должна появиться после того, как вы нажмете клавишу ввода. Введите пароль: Угадайте, что, введите свой пароль, имейте в виду, что буквы не появятся, но они есть. Нажмите клавишу ввода

Шаг пятый: проверьте, где вы сохранили свой файл, если он там, УСПЕШНО Теперь вы можете импортировать базу данных, которая будет описана далее.

Теперь, когда у вас есть экспорт базы данных mysql, вы можете импортировать ее в производственную среду.

Я восстановил файлы MySQL 5.5 *.ibd и *.frm с помощью MySQL Utilites и MariaDB 10.

shell> mysqlfrm --server=root:pass@localhost:3306 c:\MY\t1.frm --port=3310

Другим способом вы можете создать свой SQL.

2) Создайте свои таблицы
Создайте свои таблицы в базе данных.

3) alter table xxx discard tablespace
Откажитесь от ваших таблиц, которые вы хотите заменить файлами *.ibd.

4) Скопируйте файлы *.ibd (MySQL или MariaDB) в путь данных MariaDB
Сначала я пытаюсь использовать MySQL 5.5 и 5.6 для восстановления, но база данных дает сбой и немедленно останавливается из-за ошибки идентификатора табличного пространства. (ОШИБКА 1030 (HY000): ошибка -1 от механизма хранения)
После того, как я использовал MariaDB 10.1.8 и успешно восстановил свои данные.

5) alter table xxx import tablespace
Когда вы запускаете этот оператор, MariaDB предупреждает о файле, но это не важно, чем восстановить ваши данные :) База данных все еще продолжается, и вы можете видеть свои данные.

Надеюсь, эта информация будет вам полезна.

Это сработало для меня. Хотя mysqlfrm (пробовал версии 1.3.5 и 1.6.5 с MySQL 5.6 и 5.7) не давал правильного определения CREATE, даже при использовании MySQL 5.7 (значение ROW_FORMAT по умолчанию изменилось в MySQL 5.7.9), что приводило к несоответствию схемы (ожидаемый FSP_SPACE_FLAGS= 0x21, файл .ibd содержит 0x0.) при импорте табличного пространства. Ручное добавление ROW_FORMAT=compact в конце инструкции CREATE помогло.

@JānisElmeris > Ручное добавление ROW_FORMAT=compact в конце инструкции CREATE помогло. Это сработало и для меня. Спасибо! 👍

У меня была точно такая же проблема, только с файлами в качестве резервной копии.

Что я сделал, чтобы решить эту проблему, так это скопировать файлы базы данных в /var/lib/mysql/yourdb и ibdata1, который помещен в /var/lib/mysql.

Затем я смог убедиться, что могу получить доступ к таблицам mysql -u root -p dbname и выполнить запросы к некоторым таблицам, которые ранее были повреждены.

После этого я сделал дамп базы данных с помощью mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

Если вы используете MAMP и не можете запустить MySQL после копирования файлов, я поместил innodb_force_recovery = 2 в файл my.ini, после чего смог запустить mysql и экспортировать мою базу данных.

Примечание. Попробуйте установить MySQL той же версии. Если у вас была версия MySQL 5.6, из-за которой произошел сбой, установите MySQL 5.6. ( сварить установить mysql@5.6 ). Если следующий процесс не удался, попробуйте то же самое с MariaDB. (В моем случае с помощью MariaDB я возвращаю всю базу данных)

Процесс 1

  • Перед запуском необходимо остановить MySQL или MariaDB. Используйте эту команду ( brew services stop mysql ). Для служб brew MariaDB остановите mariadb
  • скопируйте файл ibdata1 из резервной папки mysql, вставьте и замените его в папку ibdata1 новой установленной папки mysql (usr/local/var/mysql) или папку mamp/xampp mysql.
  • Файлы ib_logfile0 и ib_logfile1 не нужно заменять в первую очередь. Если описанный выше процесс не работает, скопируйте этот файл из резервной папки mysql и замените. (В моем случае я не заменил)
  • Теперь скопируйте 1 базу данных для теста (например, testdb) из резервной папки mysql и вставьте ее в новую установленную папку mysql. В testdb должны быть файлы .frm и .ibd.
  • Перезапустите mysql/mariadb (сервисы brew запустят mysql) или (сервисы brew запустят mariadb)
  • Войти в MySQL -> mysql -u root -p
  • Если все правильно, вход в mysql выполнен успешно.
  • Теперь проверьте базу данных, ПОКАЗАТЬ БАЗЫ ДАННЫХ;
  • ИСПОЛЬЗУЙТЕ тестовую базу данных
  • ПОКАЗАТЬ ТАБЛИЦЫ;
  • SELECT * FROM testdbtable;
  • Если никакого массажа не показывается, значит его успешно восстановили.

Процесс 2

  • Если процесс 1 не работает, необходимо установить mysqlfrm (https://downloads.mysql.com/archives/utilities/)
  • Чтобы найти схему таблицы базы данных >> mysqlfrm --diagnostic /BACKUP/mysql/testdb > /RESTORE/testdb.sql
  • Откройте testdb.sql в notepad/sublime, вы увидите всю схему таблицы базы данных, но не данные.
  • Добавить ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; конец каждого CREATE TABLE. ENGINE=InnoDB, иначе таблица может быть не создана.
  • Создайте новую базу данных "newtestdb" и выполните команду >> mysqldump -uroot -p --databases newtestdb > testdb.sql
  • Он должен создать все таблицы базы данных. Теперь, если вы заглянете внутрь "newtestdb", вы увидите файлы .frm и .ibd.
  • Снова войдите в систему mysql >> mysql -u root -p
  • ПОКАЗАТЬ БАЗЫ ДАННЫХ; ИСПОЛЬЗОВАТЬ newtestdb;
  • Выполните эту команду одну за другой для всех таблиц, ALTER TABLE имя_таблицы DISCARD TABLESPACE; если вы отметите файл newtestbd .ibd, он исчезнет.
  • Теперь скопируйте только файл .ibd из папки testdb резервной базы данных и вставьте его в newtestdb.
  • Теперь запустите ALTER TABLE имя_таблицы IMPORT TABLESPACE;
  • Надеюсь, теперь вы получите обратно свои данные.

Если вы можете восстановить файл *.ibd на исходном сервере MySQL, не забудьте также восстановить права доступа к файлу. В моем случае (MySQL8 на CentOS7) я восстановил файл в /var/lib/mysql/db/tablename.ibd и запустил:

До исправления прав доступа при доступе к таблице возникала ошибка "2006 MySQL server is failed". После исправления прав доступа таблица заработала (даже без перезапуска службы mysqld).

Все, что вам нужно сделать, это установить dbsake:

затем используйте команду frmdump и укажите путь к вашему файлу .frm:

вы получите инструкцию создания. Сделав это, я просто выполнил шаги со 2 по 5, уже упомянутые @Ecd. Надеюсь, это кому-нибудь поможет.

Я очень ценю Ecd. Что сработало для меня:

1.- Несколько месяцев назад у меня была резервная копия базы, это помогло мне поднять эту резервную копию в xampp в Windows 10 и создать таблицы со структурой (конфигурация: Windows 10, xampp-windows- x64-7.1.30-5-VC14) файл конфигурации mysql my.ini в конце

2.- Имея старую базу данных, я приступил к выполнению alter table xxx discard tablespace для каждой таблицы в базе данных, которую я хотел восстановить, затем файлы .ibd папки данных в C:/xampp/mysql/ данные / система были удалены (в данном случае это этот путь)

3.- Я скопировал файлы .ibd из базы данных, которую хотел восстановить, в папку xampp старой базы данных

4.- Скопировав файлы, запустите: alter table xxx import tablespace Для каждой таблицы в базе данных появится предупреждение, но мы его проигнорируем, данные будут загружены в таблицу и могут быть экспортированы позже.< /p>

5.- Экспортируйте всю базу данных в файл sql и приступайте к созданию ее в действии и успеха!

Написано Чаранджитом Кауром

Одобрено Кулджитом Сингхом

Обновлено 4 марта 2022 г.

Минимальное чтение 4 минуты

Вывод: В определенных ситуациях (например, при сбое сервера MySQL, сбое оборудования и т. д.), приводящих к повреждению базы данных и потере данных, вы можете восстановить данные из файлов .FRM и .IBD. Он также предлагает специализированный инструмент восстановления MySQL для восстановления базы данных и всех данных из поврежденных файлов данных.

При использовании механизма хранения InnoDB файл .FRM используется сервером MySQL для хранения схемы таблицы, а файл .IBD используется для хранения данных и индексов базы данных MySQL. В случае случайного удаления данных или повреждения базы данных MySQL вы можете восстановить данные из файлов .FRM и .IBD.

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

Шаги по восстановлению данных из файлов .FRM и .IBD

Шаг 1. Создайте базу данных MySQL и заново создайте таблицу

Примечание. Здесь мы будем использовать phpMyAdmin для создания базы данных MySQL.

  • Войдите в phpMyAdmin.
  • Введите имя базы данных (например, employee) и нажмите «Создать». Это создаст базу данных с именем сотрудника.

  • Перейдите к пути, по которому расположены ваши базы данных MySQL, и вы увидите только что добавленную базу данных. Однако в базе данных не будет файлов .FRM и .IBD. В нашем случае базы данных можно найти в C:\xampp\mysql\data, но путь может отличаться в зависимости от веб-инструмента, который вы используете для доступа к базам данных MySQL.

  • Откройте базу данных «employee», и вы увидите, что в ней нет таблицы.

Шаг 2. Найдите схему таблицы

Примечание. Если схема таблицы доступна, перейдите к следующему шагу.

Если у вас нет схемы таблицы, загрузите утилиты MySQL. Утилиты MySQL, выпущенные Oracle, включают в себя набор сценариев для простого выполнения некоторых общих задач администратора баз данных. Mysqlfrm — это один из инструментов в утилитах, которые вы можете использовать для восстановления структуры таблицы.

После загрузки инструмента выполните следующую команду, чтобы найти схему базы данных.

Эта команда байт за байтом считывает всю информацию из файла .frm без использования экземпляра MySQL.

Примечание. Хотя этот метод удобен для извлечения данных из поврежденного файла .FRM, он может не восстановить все данные. Чтобы восстановить сопоставление или набор символов, вам потребуется выполнить следующую команду для восстановления информации из файла .FRM:

mysqlfrm --server=root@127.0.0.1 --port 3307 ./filename.frm

Шаг 3. Повторное создание таблицы базы данных

В только что созданной базе данных (в нашем случае это сотрудник) создайте новую таблицу, используя сценарий, созданный на шаге 2. Выполнение сценария создаст новый файл .FRM и .IBD в папке данных базы данных.

Шаг 4. Удалите новый файл .IBD

Выполните следующую команду, чтобы удалить новый файл .IBD:

ИЗМЕНИТЬ ТАБЛИЦУ имя_таблицы ОТМЕНИТЬ ТАБЛИЧНОЕ ПРОСТРАНСТВО;

Эта команда разрывает связь между MySQL и табличным пространством, чтобы удалить файл .IBD.

Шаг 5. Скопируйте старый файл .IBD

Теперь скопируйте исходный файл .IBD в новую базу данных.

Шаг 6. Импорт табличного пространства

Восстановите связь между таблицей MySQL и табличным пространством, выполнив следующую команду:

ALTER TABLE имя_таблицы IMPORT TABLESPACE;

Эти шаги помогут вам восстановить данные из файлов .FRM и .IBD. Но у него есть определенные недостатки:

  • Вам нужно будет вручную выполнить все шаги для каждой таблицы, чтобы восстановить базу данных MySQL; это может занять много времени.
  • Использование mysqlfrm для извлечения определения CREATE TABLE может привести к несоответствию схемы.
  • Mysqlfrm не может получить числовые последовательности AI и ограничения FK.

Лучшая альтернатива для восстановления данных из файлов .FRM и .IBD

Использование специализированного инструмента восстановления MySQL, такого как Stellar Repair for MySQL, представляет собой более простую альтернативу для восстановления вашей базы данных и всех ее данных с минимальным временем простоя. Кроме того, программа может восстанавливать файлы данных .FRM и .IBD без изменения схемы таблицы. Вы можете проверить данные перед их сохранением, загрузив демо-версию программы.

Часто задаваемые вопросы

В. При попытке удалить файл .IBD я получаю сообщение об ошибке «Это действие не может быть выполнено, так как файл открыт в формате . "Пожалуйста, помогите мне это исправить.

А. Вы получите такую ​​ошибку, если файл .IBD, который вы пытаетесь удалить, уже используется. Чтобы исправить ошибку, закройте службу MySQL, удалите файл и перезапустите службу MySQL.

В. Я использовал утилиту mysqlfrm для восстановления инструкции CREATE TABLE для таблицы.Я смог воссоздать структуру таблицы, выполнив оператор CREATE, удалив файл .IBD и скопировав старый файл .IBD. Однако при попытке импортировать табличное пространство схема таблицы не совпадает. Что я могу сделать, чтобы решить эту проблему?

А. Добавьте «ROW_FORMAT=compact» в конце запроса CREATE TABLE, чтобы решить проблему.

Ищете способ восстановить поврежденную базу данных MySQL? Если да, то ваш поиск заканчивается здесь. База данных MySQL используется для различных целей, таких как хранение данных, приложения для ведения журналов и приложения для электронной коммерции. С помощью этой базы данных можно даже хранить одну запись информации или всю информацию о продуктах.

Но данные и таблицы в базе данных MySQL хранятся в разных форматах файлов. И потеря этих файлов может нанести вред вашему бизнесу. Итак, в этой статье мы обсудим некоторые практические методы восстановления этих типов файлов MySQL. Итак, приступим.

Что такое база данных MySQL?

MySQL — это система управления реляционными базами данных (RDBMS), основанная на SQL. Теперь он стал компонентом линейки серверов баз данных и инструментов разработки материнской компании MySQL AB. В настоящее время он широко используется в таких приложениях, как хранилища данных, электронная коммерция, веб-базы данных, приложения для ведения журналов и распределенные приложения. Теперь она стала самой популярной в мире базой данных с открытым исходным кодом благодаря высокой производительности, высокой надежности, простоте использования и значительной экономии средств.

.frm — файл структуры таблицы

.ibd — в этом формате файла сохраняются данные таблицы InnoDB и индексы

Db.opt — содержит характеристики указанной базы данных

.myi — индексы таблицы MyISAM сохраняются в этом файле

Теперь давайте рассмотрим некоторые методы восстановления базы данных MySQL.

Методы восстановления баз данных MySQL

Если вы используете базу данных MySQL, есть варианты экспорта данных и импорта/восстановления данных. Используя любую из этих функций, можно легко восстановить базу данных MySQL. Пользователям также следует создать резервную копию базы данных MySQL, а затем восстановить ее с помощью команды mysqldump в cmd.

Есть еще один способ восстановления базы данных MySQL. И это если у вас есть резервная копия предыдущих данных. Итак, давайте посмотрим на этот метод.

  • Во-первых, установите сервер MySQL в вашей системе. Вы также можете установить аналогичную версию, если хотите восстановить данные из существующей версии.
  • Затем остановите службу MySQL, чтобы добавить папки данных.
  • После этого скопируйте папку резервных данных в новую папку MySQL > data >.
  • После добавления необходимых данных в новую папку MySQL перезапустите службу MySQL.
  • Теперь проверьте и восстановите таблицы базы данных. Пользователи также могут проверить таблицы базы данных с помощью команды mysqlcheck, за которой следует REPAIR. Выполнение этих шагов гарантирует, что таблицы базы данных не будут повреждены.
  • После восстановления поврежденных данных вы можете экспортировать базу данных в дамп SQL или файл SQL.

Примечание. Этот метод работает только для таблиц MyISAM и не восстанавливает таблицы InnoDB.

Восстановить базу данных SQL из файлов ibdata и frm?

Восстановить базу данных mysql из файлов frm не так сложно. Недостаточно просто скопировать файлы .frm в папку базы данных, вам также необходимо скопировать файлы ib_logfiles и ibdata в папку данных. Теперь скопируйте файлы .frm и просто перезапустите сервер, и ваша база данных будет восстановлена.

После копирования вышеуказанных файлов выполните следующую команду:

sudo chown -R mysql:mysql /var/lib/mysql

Вышеупомянутая команда изменит владельца файла в mysql и его папку на пользователя MySql. И это очень важно для чтения mysql файлов .frm и ibdata.

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

Альтернативное решение для восстановления базы данных MySQL

Если описанные выше процедуры не помогли восстановить базы данных, вы можете выбрать средство восстановления базы данных SysInfo MySQL. Это один из лучших инструментов для восстановления данных из поврежденных баз данных MySQL. Утилита позволяет пользователям просматривать каждый объект восстановленной базы данных MySQL перед его сохранением. Он поставляется с некоторыми расширенными функциями, на которые вы можете полностью положиться.

Заключение

В статье демонстрируются способы восстановления поврежденных баз данных MySQL. Это может быть сложно с ручными методами, но необходимо получить данные из поврежденных баз данных.Итак, здесь я упомянул эффективное решение, которое поможет вам починить и восстановить базу данных MySQL на сервере MySQL.

Читайте также: