Использование myisamchk для профилактики таблиц и послеаварийного восстановления
Начиная с версии MySQL 3.23.13 таблицы MyISAM можно проверять с помощью команды CHECK TABLE (см. раздел Синтаксис CHECK TABLE ). Для исправления таблиц используется команда REPAIR TABLE (см. раздел Синтаксис REPAIR TABLE ).
Для проверки/ремонта таблиц типа MyISAM (".MYI" и ".MYD") следует использовать утилиту myisamchk , а для ISAM (".ISM" и ".ISD"") - утилиту isamchk (см. главу Типы таблиц MySQL).
Ниже мы будем говорить о myisamchk , но все сказанное справедливо также и для более старой isamchk .
Утилиту myisamchk можно использовать для получения информации о таблицах рабочей базы данных, для их проверки и исправления или же оптимизации. В следующих разделах описывается, как запускать myisamchk (включая описание ее опций), как настроить график профилактики таблицы и как использовать myisamchk для выполнения различных функций.
В большинстве случаев для оптимизации и исправления таблиц можно также использовать команду OPTIMIZE TABLES, но этот вариант не такой быстрый и не такой надежный (в случае действительно фатальных ошибок), как myisamchk . С другой стороны, OPTIMIZE TABLE проще в использовании и освобождает от забот со сбросом таблиц на диск (см. раздел Синтаксис команды OPTIMIZE TABLE ).
Хотя исправление при помощи myisamchk и достаточно безопасно, никогда не будет лишним сделать резервную копию прежде, чем выполнять ремонт (или любые другие действия, которые могут привнести в таблицу значительные изменения)
Синтаксис запуска myisamchk
myisamchk запускается следующим образом:
shell> myisamchk [options] tbl_name
Опции options определяют, что должна сделать myisamchk . В данном разделе дается описание этих опций (список опций можно также получить, запустив myisamchk --help ). Если опции не указаны, myisamchk просто проверяет таблицу. Чтобы получить дополнительную информацию или указать myisamchk выполнить корректирующие действия, надо задать опции, как это описано в этом и в следующих разделах.
tbl_name - это таблица базы данных, которую нужно проверить/исправить. Если myisamchk запускается не из каталога базы данных, то следует задать путь к файлу, поскольку myisamchk не имеет представления о том, где искать базу данных. В действительности для myisamchk не важно, где находятся рабочие файлы - в каталоге базы данных или нет; можно скопировать файлы, относящиеся к базе данных, в другое место и выполнить операции восстановления над ними там.
При желании в командной строке myisamchk можно перечислить имена нескольких таблиц. В качестве имени можно также указать имя индексного файла (с суффиксом ".MYI"), что позволит задавать все таблицы в каталоге при помощи шаблона "*.MYI". Например, находясь в каталоге базы данных, можно проверить все таблицы этого каталога следующим образом:
shell> myisamchk *.MYI
Если каталог базы данных не является текущим, то все таблицы каталога можно проверить, указав к нему путь:
shell> myisamchk /path/to/database_dir/*.MYI
Можно даже проверить все таблицы во всех базах данных, если задать шаблон вместе с путем к каталогу данных MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
Быстро проверять все таблицы рекомендуется следующим образом:
myisamchk --silent --fast /path/to/datadir/*/*.MYI isamchk --silent /path/to/datadir/*/*.ISM
Если необходимо проверить все таблицы и исправить все поврежденные из них, можно использовать следующую строку:
myisamchk --silent --force --fast --update-state -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.MYI isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM
Эти команды предполагают, что имеется более чем 64 Mб свободного пространства.
Следует отметить, что если выдается ошибка, подобная следующей:
myisamchk: warning: 1 clients is using or hasn"t closed the table properly
то это означает, что делается попытка проверить таблицу, обновленную другой программой (такой как mysqld ), которая еще не закрыла файл или чье выполнение было прервано без возможности корректно закрыть файл.
Если mysqld запущен, то необходимо принудительно вызвать синхронизацию/закрытие всех таблиц с помощью FLUSH TABLES и обеспечить, чтобы никто не использовал таблиц, пока выполняется myisamchk . В версии MySQL 3.23 самый простой способ избежать этой проблемы заключается в применении для проверки таблиц команды CHECK TABLE вместо myisamchk .
Общие опции для myisamchk
myisamchk поддерживает следующие опции.
-# или --debug=debug_options
Вывод отладочной информации. Часто строка debug_options имеет следующий вид d:t:o,filename .
-? или --help
Отображение справочного сообщения с завершением работы.
-O var=option, --set-variable var=option
Устанавливает значение переменной. Вывести список допустимых переменных и их значений по умолчанию для myisamchk можно с помощью myisamchk --help :
Переменная | Значение | key_buffer_size | 523264 | read_buffer_size | 262136 |
write_buffer_size | 262136 | sort_buffer_size | 2097144 | sort_key_blocks | 16 | decode_bits | 9 |
sort_buffer_size применяется, когда ключи исправляются посредством сортировки ключей (обычный случай при указании --recover ), а key_buffer_size - если таблица проверяется с --extended-check или если ключи исправляются посредством вставки ключей в таблицу построчно (как при выполнении обычных вставок). Исправление через ключевой буфер применяется в следующих случаях:
Если используется --safe-recover .
Если размер требуемых для сортировки временных файлов будет более чем вдвое превышать объем, требующийся при создании ключевого файла непосредственно. Так часто обстоит дело, когда присутствуют большие ключи типов CHAR , VARCHAR или TEXT , поскольку при сортировке необходимо сохранять ключи целиком. Имея временное пространство на диске в избытке, можно заставить myisamchk делать исправления посредством сортировки, задав опцию --sort-recover .
Ремонт посредством ключевого буфера требует значительно меньше пространства, чем при использовании сортировки, однако выполняется значительно медленнее. Когда желательно ускорить выполнение ремонта/исправления, переменные нужно установить равными приблизительно 1/4 доступной памяти. Можно для обеих переменных задавать большие значения, поскольку всякий раз будет использоваться только один из рассматриваемых буферов.
-s или --silent
Молчаливый режим. Выдавать сообщения только при возникновении ошибок. Можно использовать -s дважды (-ss ), чтобы предельно ограничить выдачу сообщений утилитой myisamchk .
-v или --verbose
Расширенный режим вывода. Выдается больше информации. Можно использовать с -d и -e . Можно использовать -v многократно (-vv , -vvv ) - чтобы еще более расширить сводку!
-V или --version
Отображение версии myisamchk и завершение работы.
-w или, --wait
Если таблица заблокирована, то не выдавать ошибки, а, дождавшись снятия блокировки с таблицы, продолжить выполнение. Заметим, что если mysqld выполняется на таблице с --skip-locking , то таблица может быть заблокирована только другой командой myisamchk .
1 2 3 4 5 6 7
8 8 8
| |