Восстановление данных в InnoDB таблицах
Расскажу про случай, который произошел со мной, а точнее с моей базой данных. Баз данных у меня было что-то около 10 и все в формате InnoDB.
Если быть кратким, то InnoDB — это подсистема низкого уровня в системе управления базами данных MySQL с собственным механизмом транзакций и внешних ключей.
Так вот, в один из дней, не буду описывать как и почему, у меня перестали открываться все InnoDB таблицы в моих базах данных.
Как многим известно, по умолчанию, InnoDB хранит все таблицы в файлах ibdata (в моем случае только ibdata1). А следовательно, появляется некоторый шанс для восстановления данных (обычно всегда удается восстановить полностью данные).
Первым делом можно сразу же попробовать установить параметр
innodb_force_recovery=1
от 1 до 6. Поочередно запуская и просматривая логи. Если все получится, то таблицы с данными откроются.
В моем случае это не помогло и я восстанавливал все вручную.
Внимание! Сделайте резервную копию ibdata и .FRM и .IBD файлов.
При остановленном MySQL сервере файлы .FRM и .IBD легко копируются (переносятся). Если же вы хотите скопировать эти файлы не останавливая MySQL сервер, то необходимо выполнить запрос:
FLUSH TABLES table1, table2 FOR EXPORT;
, где table1, table2 — имена таблиц.
Таким образом произойдет сброс кэша на диск и экспорт выбранных таблиц.
Теперь необходимо выполнить несколько несложных шагов по подключению перенесенной таблицы на другой сервер:
- На новом месте в базе данных с точно таким же именем создаем точную структуру таблицы (пустую, без самих данных).
- Выполняем запрос:
ALTER TABLE table1 DISCARD TABLESPACE;
- Кладем скопированные файлы table1.frm и table1.ibd.
- Выполняем запрос:
ALTER TABLE table1 IMPORT TABLESPACE;
Если все прошло удачно и без ошибок — ваши таблицы теперь открываются и работают. Данные действия мне очень помогли при восстановлении большого числа таблиц.
Спасибо за внимание, и помните, всегда нужно делать резервную копию, чтобы избежать проблем в дальнейшем.