![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)

БД MySQL бывает «падают». С кем не бывает? Движки сайтов при этом ругаются страшными словами в красных рамках про пропавшие таблицы. Но не все так страшно. БД на то и созданы, чтобы все нажитое непосильным трудом не сливалось в Великое Никуда от банальной ошибки записи файла или отключения питания. Готовы? Тогда начнем...
Для этих целей используем утилиту командной строки - myisamchk. Она входит в любую штатную установку MySQL и работает с таблицами типа MyISAM.
Работа с файлами базы происходит напрямую, поэтому ремонт возможен только при остановленном сервере БД MySQL.
Заходим на сервер через терминал.
Посмотрим в файле конфигурации MySQL my.cnf, где MySQL хранит свой файлы. По умолчанию это /var/lib/mysql.
# cd /var/lib/mysql
Просмотр списка всех баз:
# ls
Останавливаем сервер БД, чтобы исключить блокировки таблиц:
# service mysql stop
или так
# /etc/init.d/mysql stop
Проверка таблиц данных
Проверка всех БД:
# myisamchk -css */*.MYI
Проверка одной БД:
# myisamchk -css имя_базы/*.MYI
Опцию -c можно опускать, она стоит по умолчанию. Двойная опция s заставляет myisamchk быть тихой (весь свой многословный вывод об исправных таблицах она сливает в /dev/null и выводит на экран только обнаруженные ошибки и предупреждения).
Восстановление данных
Битые таблицы найдены, приступаем к ремонту. Сперва делаем резервную копию тех БД, где обнаружены проблемы.
# tar -czvf имя_базы.tgz имя_базы
Потом дополнительно проверяем отдельные таблицы, имена которых получили на предыдущем этапе:
# myisamchk -с имя_базы/имя_таблицы.MYI
Может Вы и получите какую-то полезную информацию, но обычно myisamchk рекомендует чинить таблицу. :)
# myisamchk -r имя_базы/имя_таблицы.MYI
Иногда утилита не может этого сделать, тогда пробуем другой режим (safe):
# myisamchk -o имя_базы/имя_таблицы.MYI
Если все OK, то запускаем сервер и БД заработают снова.
# service mysql start
или
# /etc/init.d/mysql start
Не забываем удалить файл бэкапа, если он не нужен:
# rm имя_базы.tgz
Дополнение mysqlcheck
Есть и версия обработки всего вышеописанного процесса для очень ленивых :)
Это, обработает все MyISAM таблицы во всех БД, доступных указанному пользователю и работает без остановки сервера MySQL:
# mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
или в конкретной БД:
# mysqlcheck -u root -p --auto-repair --check --optimize имя_базы_данных
Без оптимизации, только проверку и ремонт можно сделать и для таблиц типа InnoDB:
# mysqlcheck -u root -p --auto-repair --check —all-databases
Profit!
* В процессе восстановления создается дополнительная временная таблица равная по размеру исходной. Учитывайте это при расчете свободного места на HDD!
**Описание утилиты myisamchk myisamchk — MyISAM Table-Maintenance Utility.