Исправляем поврежденные MySQL-таблицы с myisamchk
MyISAM — основная, вернее, одна из главных (наряду с InnoDB) систем хранения данных в СУБД MySQL. При этом MyISAM таблицы повреждаются очень просто — с этим проблем нет никаких. Сложнее все повреждения ликвидировать, хотя это тоже можно сделать довольно быстро. В этом материале объясняется, как можно решить проблему с использованием myisamchk для идентификации проблемы с MyISAM и ее исправления.Общеизвестно, что при создании таблицы в MySQL, создаются три различных файла: *.frm — формат таблицы, *.MYD (MyData) — хранение данных, *.MYI (MyIndex) — индекс. Для крупных баз данных стоит использовать InnoDB, поскольку здесь есть некоторая схожесть с Oracle и соответствующая функциональность.В качестве примера демонстрации ошибки будем использовать вот это:
undef error — DBD: mysql: db selectrow_array failed: Table 'attach_data' is marked as crashed and should be repaired [for Statement «SELECT LENGTH (thedata) FROM attach_data WHERE id = ?»] at Bugzilla/Attachment.pm line 344 Bugzilla: Attachment: datasize ('Bugzilla: Attachment=HASH (0×9df119c)') called Понятно, что таблица attach_data повреждена, и ее нужно исправить. Таблицу будем исправлять с использованием myisamchk.
1. Определяем все поврежденные таблицы, используя myisamchk # myisamchk /var/lib/mysql/bugs/*.MYI >> /tmp/myisamchk_log.txt myisamchk: error: Wrong bytesec: 0–0–0 at linkstart: 18361936 MyISAM-table 'attach_data.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 'groups.MYI' is usable but should be fixed myisamchk: warning: 1 client is using or hasn’t closed the table properly MyISAM-table 'profiles.MYI' is usable but should be fixed Если указать вывод myisamchk во временный файл, на дисплее будут показаны только имена поврежденных таблиц. А вот в файле /tmp/myisamchk_log.txt будет указано гораздо больше данных включая имена неповрежденных таблиц:
Checking MyISAM file: user_group_map.MYI Data records: 182 Deleted blocks: 0 — check file-size — check record delete-chain — check key delete-chain — check index reference — check data record references index: 1 2. Исправляем поврежденные таблицы, используя myisamchk Для этого используем myisamchk, с опцией -r, как и показано ниже:
# myisamchk -r profiles.MYI — recovering (with sort) MyISAM-table 'profiles.MYI' Data records: 80 — Fixing index 1 — Fixing index 2 Здесь может появиться сообщение об ошибке: clients are using or haven«t closed the table properly, в случае, если таблицы до сих пор используются каким-либо приложением или другими таблицами. Для того, чтобы избежать появления этой ошибки, стоит завершить mysqld, прежде, чем начать исправление таблиц. Здесь можно использовать FLUSH TABLES.
Запускаем проверку и исправлением для всей БД MySQL
# myisamchk --silent --force --fast --update-state /var/lib/mysql/bugs/*.MYI myisamchk: MyISAM file /var/lib/mysql/bugs/groups.MYI myisamchk: warning: 1 client is using or hasn’t closed the table properly myisamchk: MyISAM file /var/lib/mysql/bugs/profiles.MYI myisamchk: warning: 1 client is using or hasn’t closed the table properly -s: выводим только ошибки. Можно использовать двойной -s -s, чтобы сделать режим максимально «тихим»;-f: автоматический перезапуск myisamchk с опцией -r, есть обнаружены ошибки;-F: проверка только таблиц, которые не были закрыты в нормальном режиме;-U: отмечаем таблицы, как поврежденные, если обнаружены ошибки.
4. Использование дополнительной памяти для больших БД MySQL В случае работы с большими БД восстановление может занять несколько часов. Если есть дополнительные ресурсы, их можно использовать для ускорения процесса:
# 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 5. Использование myisamchk для получения данных о таблице При необходимости можно получить довольно много данных.
# myisamchk -dvv profiles.MYI MyISAM file: profiles.MYI Record format: Packed Character set: latin1_swedish_ci (8) File-version: 1 Creation time: 2007–08–16 18:46:59 Status: open, changed, analyzed, optimized keys, sorted index pages Auto increment key: 1 Last value: 88 Data records: 88 Deleted blocks: 0 Datafile parts: 118 Deleted data: 0 Datafile pointer (bytes): 4 Keyfile pointer (bytes): 4 Datafile length: 6292 Keyfile length: 6144 Max datafile length: 4294967294 Max keyfile length: 4398046510079 Recordlength: 2124 table description: Key Start Len Index Type Rec/key Root Blocksize 1 2 3 unique int24 1 1024 1024 2 5 765 unique char packed stripped 1 2048 4096 Field Start Length Nullpos Nullbit Type 1 1 1 2 2 3 no zeros 3 5 765 no endspace 6. Все опции 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.