Назад | Перейти на главную страницу

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

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

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

2015-06-09 23:09:23 14642 [Note] InnoDB: Starting crash recovery.
2015-06-09 23:09:23 14642 [Note] InnoDB: Reading tablespace information from the .ibd files...
2015-06-09 23:09:24 14642 [ERROR] InnoDB: Tried to read 16384 bytes at offset 0. Was only able to read 0.
2015-06-09 23:09:24 7f648369a7e0  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
InnoDB: If you are installing InnoDB, remember that you must create
InnoDB: directories yourself, InnoDB does not create them.
2015-06-09 23:09:24 14642 [ERROR] InnoDB: File (unknown): 'read' returned OS error 71. Cannot continue operation

Когда db был запущен с innodb-force-recovery установлено значение 6, сервер запущен, с множеством этих сообщений в журнале ошибок:

2015-06-09 23:16:50 16659 [ERROR] InnoDB: Failed to find tablespace for table '"db1234"."tbl456"' in the cache. Attempting to load the tablespace with space id 275772.

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

Итак, теперь у меня есть несколько (около сотни) баз данных, которые нельзя загрузить в действующий сервер MySQL. У меня есть их файлы данных (файлы .frm и .ibd), но они как-то повреждены, и MySQL не может их открыть:

2015-06-10 18:37:18 3965 [Warning] InnoDB: Cannot open table db123/tbl456 from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.

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

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

Итак, теперь у меня есть данные в файлах данных innodb, но я не могу загрузить их на живой сервер. Есть ли способ их спасти?

Я нашел этот инструментарий: https://www.percona.com/software/mysql-innodb-data-recovery-tools, но я не уверен, можно ли его использовать, это довольно сложно, и я не знаю, как восстановить сотню баз данных, структура которых мне неизвестна ..

Сервер использует MySQL 5.6.17, скомпилированный из исходников.

Как автор набора инструментов для восстановления данных Percona, я рекомендую вам использовать Набор инструментов для восстановления данных TwinDB. Последние два года инструментарий Percona не совершенствовался, и все новые функции переходят в инструментарий TwinDB. Ваш случай описан в посте Восстановить поврежденную базу данных MySQL

Чтобы восстановить структуру таблицы, вы можете использовать mysqlfrm инструмент или восстановить структуру из Словарь InnoDB