Как восстановить базу данных MySQL из файлов .myd, .myi, .frm

183

Как восстановить один из моих баз данных MySQL из .myd, .myi, .frmфайлов?

chandrajeet
источник
10
Хотя я ответил на это, это действительно относится к Serverfault.
Дероберт
31
@chandrajeet вы действительно должны принять наиболее проголосовавший ответ.
Башня
2
Эй, Чандраджит, почему ты не принимаешь ответ Дероберта? Я подтверждаю, что это работает и для меня. Разве это не для вас? stackoverflow.com/help/someone-answers
Таз

Ответы:

173

Если это таблицы MyISAM, то добавление файлов .FRM, .MYD и .MYI в каталог базы данных (например, /var/lib/mysql/dbname) сделает эту таблицу доступной. Это не обязательно должна быть та же база данных, с которой они пришли, тот же сервер, та же версия MySQL или та же архитектура. Вам также может понадобиться сменить владельца папки (например, chown -R mysql:mysql /var/lib/mysql/dbname)

Обратите внимание, что разрешения ( GRANTи т. Д.) Являются частью mysqlбазы данных. Таким образом, они не будут восстановлены вместе со столами; вам может потребоваться выполнить соответствующие GRANTоператоры для создания пользователей, предоставления доступа и т. д. (Восстановление mysqlбазы данных возможно, но вы должны быть осторожны с версиями MySQL и любыми необходимыми запусками mysql_upgradeутилиты.)

На самом деле, вам, вероятно, просто нужны .FRM (структура таблицы) и .MYD (данные таблицы), но вам придется восстановить таблицу, чтобы перестроить .MYI (индексы).

Единственным ограничением является то, что если вы выполняете понижение версии, вам лучше проверить примечания к выпуску (и, вероятно, запустить таблицу исправлений). Более новые версии MySQL добавляют функции, конечно.

[Хотя это должно быть очевидно, если вы смешиваете и сопоставляете таблицы, целостность отношений между этими таблицами - ваша проблема; MySQL не волнует, но ваше приложение и ваши пользователи могут. Кроме того, этот метод вообще не работает для таблиц InnoDB. Только MyISAM, но, учитывая файлы, которые у вас есть, у вас есть MyISAM]

derobert
источник
Будет ли это действительно работать без добавления соответствующих записей в таблицу information_schema? Я имею в виду, MySQL нужно знать, чтобы искать эти файлы правильно?
Zenshai
4
Таблицы information_schema на самом деле не существуют, они представляют собой только представления о состоянии внутренней базы данных. См. Dev.mysql.com/doc/refman/5.0/ru/information-schema.html
Брайан, Бразилия,
4
Ух ты, я чувствовал себя грязно, но удаление всего каталога из того, что я считаю установкой MySQL4 в мой MySQL5.1, просто волшебным образом воссоздало таблицы. Нет перезагрузки или что-нибудь (на окнах).
Дейв
4
Это работает, вам просто нужно запомнить, чтобы запустить (для каждой таблицы): check table sometable; и затем запустить ремонт (только при необходимости): repair table sometable;
Nux
3
Это сработало отлично! Я поместил файлы на место, но mysql не «видел» их, пока я не сменил владельца на «mysql: mysql».
sean.boyer
26

Обратите внимание, что если вы хотите перестроить файл MYI, тогда правильное использование REPAIR TABLE:

REPAIR TABLE sometable USE_FRM;

В противном случае вы, вероятно, просто получите еще одну ошибку.

mcardellg
источник
24

Я только что нашел решение для этого. Я использую MySQL 5.1 или 5.6 на Windows 7.

  1. Скопируйте файл .frm и ibdata1 из старого файла, который находился в «C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data»
  2. Остановите экземпляр SQL-сервера в текущем экземпляре SQL
  3. Перейдите в папку данных, расположенную в «C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data»
  4. Вставьте ibdata1 и папку вашей базы данных, которая содержит файл .frm, из файла, который вы хотите восстановить.
  5. Запустите экземпляр MySQL.

Нет необходимости искать файлы .MYI и .MYD для этого восстановления.

alnel
источник
Выполнили эти шаги (после того, как все остальное не удалось) и использовали innodb_force_recovery = 4уровень (не уверен, что было необходимо в этом случае). Слава Богу!
Джошуа Стюардсон
6
К вашему сведению: ibdata1это InnoDB, а не MyISAM.
Дероберт
14

Стоит отметить:

Файл .FRM содержит структуру вашей таблицы и зависит от вашей версии MySQL.

Файл .MYD НЕ относится к версии, по крайней мере, к второстепенным версиям.

Файл .MYI специфичен, но его можно пропустить и восстановить, REPAIR TABLEкак говорят другие ответы.

Цель этого ответа - дать вам знать, что если у вас есть дамп схемы ваших таблиц, вы можете использовать его для создания структуры таблицы, а затем заменить эти файлы .MYD своими резервными копиями, удалить файлы MYI и восстановить их. все. Таким образом, вы можете восстановить ваши резервные копии в другой версии MySQL или полностью переместить базу данных без использования mysqldump. Я нашел это супер полезным при перемещении больших баз данных.

казарка
источник
14

Просто! Создать фиктивную базу данных (скажем, abc)

Скопируйте все эти файлы .myd, .myi, .frm в mysql \ data \ abc, где mysql \ data \ - это место, где хранятся .myd, .myi, .frm для всех баз данных.

Затем перейдите к phpMyadmin, перейдите в db abc, и вы найдете свою базу данных.

Вишал
источник
самый короткий и точный ответ
Серак Шифер
Лучший способ восстановить данные ... Я установил WAMP, затем создал новую базу данных, скопировал файлы в новый каталог базы данных C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase, откройте phpmyadmin и вашу новую базу данных. посмотреть данные
Александр Жорж
7

Я думаю, что .myi вы можете восстановить изнутри MySQL.

Если вы видите сообщения об ошибках такого типа из MySQL: База данных не смогла выполнить запрос (запрос) 1016: Невозможно открыть файл: 'sometable.MYI'. (errno: 145) Сообщение об ошибке: 1034: неверный ключевой файл для таблицы: 'sometable'. Попробуйте починить его, тогда у вас, вероятно, разбитый или поврежденный стол.

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

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

и теперь ваш стол должен быть в порядке:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+
Эльзо Валуги
источник
6

Я нашел решение для преобразования файлов в .sqlфайл (вы можете затем импортировать .sqlфайл на сервер и восстановить базу данных) без необходимости доступа к /varкаталогу, поэтому вам не нужно быть администратором сервера, чтобы сделать это.

Требуется XAMPP или MAMP, установленный на вашем компьютере.

  • После установки XAMPP перейдите в каталог установки (обычно C:\XAMPP) и подкаталог mysql\data. Полный путь должен бытьC:\XAMPP\mysql\data
  • Внутри вы увидите папки любых других баз данных, которые вы создали. Копировать и Вставить папку полный .myd, .myiи .frmфайлы в там. Путь к этой папке должен быть

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • Затем зайдите localhost/phpmyadminв браузер. Выберите базу данных, которую вы только что вставили в mysql\dataпапку, и нажмите «Экспорт» на панели навигации. Выбирает экспорт в виде .sqlфайла. Затем появится всплывающее окно с вопросом, где сохранить файл

И это все! Вы (должны) теперь есть .sqlфайл , содержащий базу данных , которая была изначально .myd, .myiи .frmфайлы. Затем вы можете импортировать его на другой сервер через phpMyAdmin, создав новую базу данных и нажав «Импорт» на панели навигации, а затем следуя инструкциям по ее импорту.

Каспар Ли
источник
5

Вы можете скопировать файлы в соответствующий каталог подкаталога папки данных, если это ТОЧНАЯ версия mySQL и вы сохранили все связанные файлы в этом каталоге. Если у вас нет всех файлов, я уверен, что у вас будут проблемы.

CGP
источник
Что мне делать, если у меня нет ТОЧНОЙ версии MySQL?
Джо Спрэг
2

Приведенного выше описания было недостаточно, чтобы все работало на меня (возможно, плотно или лениво), поэтому я создал этот сценарий, как только нашел ответ, который поможет мне в будущем. Надеюсь, что это помогает другим

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
dny238
источник
-2

Для тех, у кого Windows XP и установлен MySQL сервер 5.5 - расположение базы данных C: \ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data, если только вы не изменили расположение в установке MySql Workbench. GUI.

демон
источник
3
Речь идет о восстановлении файлов определенных типов, а не о том, где эти файлы можно найти в Windows XP MySQL 5.5.
Данпе