Восстанавливаем таблицу MySQL

Как то раз случилась беда — делал оптимизацию таблиц БД и забыл, что таблица форумных сообщений огромна и будет обрабатываться вечность. Прерванный процесс, естественно, убил ее. Вернее не убил, но ошибок наделал.

Что первое приходит в голову? Сделать востановление в phpmyadmin. Запускаю, делает, страничка браузера обновляется, процесс идёт, сервер висит намертво, не работают все сайты на нём. Останавливаю, потому что надоело. Ничего не оживает, приходится перезапускать mysqld. Решаю попробовать тоже самое ночью, оставив процесс на пяток часов, может не хватает времени… Оставляю. Спустя пять часов так же никакого результата. Теперь приходится перезапускать весь сервер, потому что даже подключиться по SSH не получается. Печаль…

Начинаю думать, может проблема в phpmyadmin и стоит попробовать через SSH доступа востановить таблицу. Сказано — сделано. Запускаю

mysqlcheck -r db_name table_name -uroot -p

В результате кроме надписи «Connecting to mysql» — ничего. Понять, что происходит совершенно невозможно. Одно понятно точно — сервер вновь весит.

Пытаюсь сделать dump базы на всякий случай командой

mysqldump -uroot -p db_name > db_name.sql

Ничего не получается, пишет «Table is marked as crashed and last (automatic?) repair failed when using LOCK TABLES»

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

Приступаем к процессу

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

cd /var/lib/mysql/db_name

В данной папке находятся файлы таблиц. Нам нужно выбрать обработку поврежденной и запустить процесс так:

myisamchk -r crashed-table

а еще лучше вот так, чтобы видеть всё, что делается (в данном случае включены опции --verbose и --force)

myisamchk -r -v -f crashed-table

После выполнения команды мы должны получить полностью исправную таблицу. У меня получилось! :-)