Исправляем поврежденные MyISAM таблицы с myisamchk

Исправляем поврежденные 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» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.