
Исправляем поврежденные MyISAM таблицы с myisamchk
MyISAM — наиболее часто используемая система для хранения данных в MySQL и иногда, таблицы повреждаются очень часто. В данной теме «Исправляем поврежденные MyISAM таблицы с myisamchk» я расскажу как можно отремонтировать поврежденные таблицы MyISAM с использованием myisamchk.
Когда вы создаете таблицу в MySQL, при этом создаются файлы:
- *.frm — служит форматом для таблиц.
- *.MYD (MyData) — сохраняются данных.
- *.MYI (MyIndex) — индексный файл.
Для более больших БД настоятельно рекомендуется юзать не MyISAM а именно — InnoDB, т.к в ней содержится подобные черты с Oracle и его функционал.
1. Первое что стоит сделать, так это вывести все поврежденные таблицы:
# myisamchk /var/lib/mysql/acdperu_blog/*.MYI >> /tmp/myisamchk_log_file.txt myisamchk: error: Wrong bytesec: 0-0-0 at linkstart: 18361936 MyISAM-table 'some_info.MYI' is corrupted Fix it using switch "-r" or "-o" myisamchk: warning: 1 client is using or hasn't closed the table properly MyISAM-table 'my_users.MYI' is usable but should be fixed myisamchk: warning: 1 client is using or hasn't closed the table properly MyISAM-table 'users_data.MYI' is usable but should be fixed
Если указать вывод myisamchk во временный файл, на дисплее будут показаны только имена поврежденных таблиц. А вот в файле /tmp/myisamchk_log_file.txt будет указано гораздо больше данных включая имена не поврежденных таблиц. Вы можете прочитать и ознакомится:
# vim /tmp/myisamchk_log_file.txt
2. Чтобы пофиксить поврежденную таблицу (my_cards) я буду использовать myisamchk, с параметром -r:
# myisamchk -r my_cards.MYI - recovering (with sort) MyISAM-table '/var/lib/mysql/acdperu_blog/wp_usermeta.MYI' Data records: 18 - Fixing index 1 - Fixing index 2 - Fixing index 3
Или все таблицы:
# myisamchk -r /var/lib/mysql/driasses_joomla5/*
Тут может показать ошибку «clients are using or haven’t closed the table properly» и если видите данную ошибку, то исправлением служит завершение демона mysql (до старта исправления таблиц).
Используем команду FLUSH TABLES.
Запущу проверку и исправление всех повреждений для всей БД (my_bugs):
# myisamchk --silent --force --fast --update-state /var/lib/mysql/my_bugs/*.MYI
-s: Показывает только ошибки. Можно так же использовать -s -s, для использования максимально «тихого» режима;
-f: С параметром -r выполняется автоматическая перезагрузка myisamchk если обнаружены ошибки;
-F: Выполняется проверка только тех таблиц, которые не были закрыты при нормальном режиме;
-U: Отметим таблицы как поврежденные, при появлении ошибки.
При работе с большими БД, то на восстановление может потребоваться довольно много времени ( несколько часов). Если есть дополнительные ресурсы, то их можно заюзать для ускорения роботы:
# myisamchk --silent --force --fast --update-state \ --key_buffer_size=512M --sort_buffer_size=512M \ --read_buffer_size=4M --write_buffer_size=4M \ /var/lib/mysql/bugs/*.MYI
Если есть необходимость, можно получить очень много полезной информации:
# myisamchk -dvv /var/lib/mysql/acdperu_blog/wp_users.MYI
Опции для работы с myisamchk.
Для использования утилиты, используйте список возможных команд:
# myisamchk --help
Основные опции:
-s: Показать только ошибки;
-v: Выводит много различной информации;
-V: Показывает версию утилиты и завершается;
-w: Ожидание, если таблица заблокирована.
Опции для проверки:
-c: Служит для проверки таблиц на ошибки;
-е: «грубая» проверка. Стоит использовать ее крайне редко (когда в обычном режиме не найдены ошибки);
-F: Проверка (быстрая), в которой проверяются одни таблицы, которые правильно не закрывались;
-С: Проверять только те таблицы, в которых производились изменения со времени последней поверки;
-f: Перезапуск myisamchk в автоматическом режиме если обнаружены какие то ошибки с опцией -r ;
-i: Показать инфу по проверенным таблицам;
-m: «Легкий» режим проверки, он работает быстрее чем обычный и тут находится 99,99% ошибок;
-U: Обновляет статус: делает пометку таблиц как поврежденных при обнаружении любой ошибки;
-T: Не помечать таблицы как проверенные.
Опции для исправления:
-B: Бэкап файла .MYD, «filename-time.BAK»;
—correct-checksum;
-е: Попытка исправить макс числа строк в файле ( данная команда ищет «мусорные» строки). Не используйте данную опцию, если ситуация не безнадежна;
-f: Перезаписать временные старые файлы;
-r: Исправить практически все, но кроме уникальных ключей, которые на самом деле не уникальны;
-n: Принудительно сортировать и выполнять даже, если временный файл очень большой;
-о: Использовать старый метод для восстановления;
-q: Быстрое исправление и без каких-либо модификаций файла данных;
-u: Распаковать файлы, запакованного myisampack.
Другие опции:
-a, —analyze : Анализ распределенных ключей. Сделает некоторые JOIN в MySQL быстрее. Вы можете проверить расчетное распределение с помощью ‘—description —verbose table_name‘.
-d, —description : вывести некоторую информацию о таблице.
Еще один метод по восстановлению таблиц.
Хотя, Mysqlcheck и Myisamchk схожи в целях, есть некоторые существенные различия. Mysqlcheck а также Myisamchk можете проверить и отремонтировать, а так же анализировать MyISAM таблиц. Mysqlcheck также можете проверить таблицы InnoDB.
Показывает, если нужен какой-то ремонт:
# myisamchk --check /var/lib/mysql/*/*.MYI
Для начала, попробуйте «безопасного восстановление»:
# myisamchk --safe-recover /var/lib/mysql/*/*.MYI
И, если ничего не нужно, то не выполняйте это:
# myisamchk --recover /var/lib/mysql/*/*.MYI
Если не помогло, то используйте флаг — ‘force’:
# myisamchk --recover --extend-check --force /var/lib/mysql/*/*.MYI
Если все что выше, не помогло,то стоит попытаться использовать Mysqlcheck:
Восстановить все базы:
# mysqlcheck --all-databases -r
Проанализировать все базы:
# mysqlcheck --all-databases -a
Оптимизировать все базы:
# mysqlcheck --all-databases -o
Восстанавливаем одну базу:
# mysqlcheck -ro database_name
Восстанавливаем один столбец в базе:
# mysqlcheck -ro database_name table_name
Статья «Исправляем поврежденные MyISAM таблицы с myisamchk» завершена.