holydiver_777: icon (Default)
holydiver_777 ([personal profile] holydiver_777) wrote2015-07-07 06:19 pm

Gentoo: Table Maintenance and Crash Recovery или ремонт и восстановление таблиц БД - MySQL.

gentoo_my
БД 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.