Восстановление базы данных MySQL из физических файлов


143

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

client.frm
client.MYD
client.MYI

но еще примерно на 20 столов.

Я обычно использую mysqldump или аналогичный инструмент, чтобы получить все в одном файле SQL, так что же делать с этими типами файлов?


У меня такая же проблема: несколько файлов с расширениями FRM, MYD и MYI. У меня также есть файлы ib_logfile0, ib_logfile1 и ibdata1. Я не могу получить доступ к работающему серверу или создать дамп. Я попытался запустить новый сервер MySQL и использовать файлы, но у меня ничего не вышло ... Есть ли у кого-нибудь четкие инструкции?
flo5783 05

Ответы:


134

Таблица MySQL MyISAM представляет собой комбинацию трех файлов:

  • Файл FRM - это определение таблицы.
  • В файле MYD хранятся фактические данные.
  • В файле MYI хранятся индексы, созданные для таблицы.

Вы должны иметь возможность восстановить, скопировав их в папку своей базы данных (в Linux расположение по умолчанию /var/lib/mysql/ )

Вы должны делать это, пока сервер не работает.


66
это верно только для таблиц MyISAM. InnoDB хранит свои таблицы и индексы в едином табличном пространстве *, которое по умолчанию состоит из трех файлов: ibdata1, ib_logfile0 и ib_logfile1. для восстановления базы данных вам также понадобятся эти файлы. * Табличные пространства для каждой таблицы возможны, но не по умолчанию
ax.

21
Он говорит, что у него есть файлы .frm, .myi и .myd. Затем я предположил, что это таблицы MyISAM.
Винсент,

5
Ценный ответ, но мне пришлось сделать еще один шаг, чтобы все работало нормально: поскольку мне приходилось входить в систему как root для восстановления файлов, mysqlпользователь, выполняющий mysqldпроцесс, не мог получить к ним доступ. Сделать a chmod -R mysql:mysql .в каталоге данных mysql быстро и легко, но выяснение до этого, почему все мои повторно обновленные БД, похоже, не имеют таблиц, заняло немного больше времени.
Эдурн Паскуаль

10
herenvardo, я думаю, вы имели в виду chown, а не chmod
Оливер М. Греч

2
Чтобы резюмировать некоторые важные примечания, вам, возможно, придется chownскопировать файлы следующим образом:sudo chown -R mysql:mysql /var/lib/mysql
Jacksonkr

53

Из ответа @Vicent я уже восстанавливаю базу данных MySQL, как показано ниже:

Шаг 1. Выключите сервер Mysql.

Шаг 2. Скопируйте базу данных в папку с базой данных (в Linux расположение по умолчанию - / var / lib / mysql). Сохраните то же имя базы данных и то же имя базы данных в режиме mysql.

sudo cp -rf   /mnt/ubuntu_426/var/lib/mysql/database1 /var/lib/mysql/

Шаг 3: Измените свою и измените режим папки:

sudo chown -R mysql:mysql /var/lib/mysql/database1
sudo chmod -R 660 /var/lib/mysql/database1
sudo chown  mysql:mysql /var/lib/mysql/database1 
sudo chmod 700 /var/lib/mysql/database1

Шаг 4. Скопируйте ibdata1 в папку базы данных.

sudo cp /mnt/ubuntu_426/var/lib/mysql/ibdata1 /var/lib/mysql/

sudo chown mysql:mysql /var/lib/mysql/ibdata1

Шаг 5: скопируйте файлы ib_logfile0 и ib_logfile1 в папку вашей базы данных.

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile0 /var/lib/mysql/

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile1 /var/lib/mysql/

Не забудьте изменить собственный и изменить корень этих файлов:

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

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

или

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

Шаг 6 (необязательно): у моего сайта есть конфигурация для хранения файлов в определенном месте, затем я точно копирую их в соответствующее место.

Шаг 7: Запустите сервер Mysql. Все вернусь и наслаждайся.

Вот и все.

См. Дополнительную информацию по адресу: https://biolinh.wordpress.com/2017/04/01/restoring-mysql-database-from-physical-files-debianubuntu/


4
+1 за подробные пошаговые инструкции. Но я отредактировал некоторые заявления, чтобы они действительно отражали то, какими они должны быть.
Питер

Получена ошибка # 1932, нет доступа к данным. Базы данных появляются, но данные недоступны. Запуск XAMPP 7.2.12 в MAC OS X Mojave.
Steve1754a

@ Steve1754a ошибка может быть по многим причинам 1. Вы перемещаете базу данных из Mac OS в Mac OS? 2. Пожалуйста, проверьте разрешение этих файлов / данных / таблицы
biolinh

Ответы: 1. Да; 2. Я сделал. Мне пришлось провести полную перестройку моей БД. Не мог придумать решения. Мораль истории: всегда создавайте резервную копию БД. Хотелось бы, чтобы в XAMPP был простой способ сделать это автоматически.
Steve1754a

2
Ты спас мне жизнь
Губка Пабло

9

Если вы восстанавливаете папку, не забудьте указать файлы в mysql: mysql,

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

иначе вы получите ошибки при попытке удалить базу данных или добавить новый столбец и т. Д.

и перезапустите MySQL

service mysql restart

2
это не совсем ответ на вопрос, но был очень полезен.
ryantuck

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

9

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

Мне удалось восстановить только папки базы данных mysql из моей ОС Ubuntu. Моя проблема в том, как восстановить мою базу данных с этими нечитаемыми папками данных mysql. Поэтому я снова переключился на ОС win7 для среды разработки.

* ПРИМЕЧАНИЕ. У меня есть существующий сервер базы данных, работающий в Win7, и мне нужно только несколько файлов базы данных для извлечения из восстановленных файлов. Чтобы успешно восстановить файлы базы данных из ОС Ubuntu, мне нужно заново установить сервер базы данных mysql (та же версия из ОС Ubuntu в моей ОС win7), чтобы восстановить все на этом старом сервере базы данных.

  1. Сделайте другой новый сервер базы данных mysql той же версии из восстановленных файлов.

  2. Остановите сервер mysql

  3. скопируйте восстановленную папку и вставьте в (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data) база данных mysql.

  4. скопируйте файл ibdata1, расположенный в установленной папке linux mysql, и вставьте его в (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data). Просто перезапишите существующий или сделайте резервную копию перед заменой.

  5. запустите сервер mysql и проверьте, успешно ли вы восстановили файлы базы данных.

  6. Чтобы использовать восстановленную базу данных на моем текущем сервере mysql, просто экспортируйте восстановленную базу данных и импортируйте ее на мой существующий сервер mysql.

Надеюсь, это поможет, потому что у меня больше ничего не работало.


1
Метод также работает в ubuntu / debian с файлами ibdata1, ib_logfile0 и ib_logfile1 и папкой базы данных. user не будет скопирован, но тогда вы можете добавить нового пользователя в базу данных и выгрузить его вместе с ним.
bokorben

2

С MySql 5.1 (Win7). Чтобы воссоздать БД (InnoDbs), я заменил все содержимое следующих каталогов (параметры my.ini):

datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"
innodb_data_home_dir="C:/MySQL Datafiles/"

После этого я запустил службу MySql, и все работает нормально.


1

Да, это! Просто добавьте их в папку с базой данных (в зависимости от ОС) и выполните такую ​​команду, как «MySQL Fix Permissions». Это восстановило базу данных. Также убедитесь, что для файлов установлены правильные разрешения.


Я сделал это, но я не распознаю таблицы. Как я уже сказал в своем комментарии к предыдущему ответу.
orezvani 03

0

Однажды я скопировал эти файлы в папку хранения базы данных для базы данных mysql, которая работала, запустил базу данных и подождал, пока она «восстановит» файлы, а затем извлек их с помощью mysqldump.


0

Я столкнулся с этим, пытаясь восстановить случайно удаленный контейнер Docker (MySQL oraclelinux) из тома докера, который, к счастью, не был удален, с данными БД в физических файлах.

Итак, все, что я хотел сделать, это превратить данные из физических файлов в .sqlимпортируемый файл, чтобы воссоздать контейнер с БД и данными.

Я попробовал раствор биолина , но наткнулся на[InnoDB] Multiple files found for the same tablespace ID после перезапуска ошибками. Я понял, что делать открытую операцию по повреждению определенных папок / файлов довольно сложно.

Решение , которое работало для меня было временно изменяя datadir=в my.cnfк доступной папке и перезапуск сервера MySQL. Он отлично справился со своей задачей!


-1

В моем случае простого удаления tc.log в / var / lib / mysql было достаточно, чтобы снова запустить mariadb / mysql.


это не проблема возможности запустить / перезапустить сервер mysql.
Олуватумби
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.