В данном разделе рассматривается только использование myisamchk на таблицах MyISAM (расширения `.MYI' и `.MYD'). Если же в системе применяются таблицы ISAM (расширения `.'ISM и `.'ISD), то следует пользоваться isamchk.
Начиная с версии MySQL 3.23.14 можно ремонтировать таблицы MyISAM при помощи команды REPAIR TABLE (see section 4.4.5 Синтаксис REPAIR TABLE).
К симптомам повреждения таблицы относятся неожиданные прерывания выполнения запросов и появление следующих ошибок:
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repairedЗаметим, что ошибка 135 - 'no more room in record file' ('не осталось места в файле записей'), не может быть исправлена просто выполнением ремонта. В этом случае необходимо использовать следующую команду:
ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
В других случаях следует выполнять ремонт таблиц. myisamchk обычно может обнаружить и исправить большинство неполадок.
Процесс ремонтирования включает до четырех описанных здесь стадий. Перед тем как приступить к ремонту, необходимо выполнить `cd' в каталог базы данных и проверить права доступа к табличным файлам. Файлы должны быть доступны для чтения Unix-пользователю, от имени которого выполняется mysqld, (а также выполняющему ремонт, поскольку ему приходится обращаться к проверяемым файлам). Если появится необходимость изменять файлы, то проверяющий также должен иметь доступ для записи.
Если используется версия MySQL 3.23.16 и выше, то для проверки и ремонта таблиц MyISAM можно (и нужно) использовать команды CHECK и REPAIR (section 4.4.4 Синтаксис CHECK TABLE и see section 4.4.5 Синтаксис REPAIR TABLE).
Раздел руководства, посвященный сопровождению таблиц, содержит опции к isamchk/myisamchk (see section 4.4.6 Использование myisamchk для профилактики таблиц и послеаварийного).
Случаи, когда упомянутые команды не дают результата или желательно использовать расширенные возможности, представленные в isamchk/myisamchk, рассматриваются в следующем разделе.
Если ремонт таблицы планируется выполнять из командной строки то сначала требуется остановить сервер. Следует отметить, что при выполнении mysqladmin shutdown с удаленного сервера mysqld все еще будет некоторое время работать после завершения mysqladmin, пока не будут остановлены все запросы и сброшены на диск все ключи.
Стадия 1: проверка таблиц
Выполните myisamchk *.MYI или, если вы располагаете временем, myisamchk -e *.MYI. Используйте опцию -s (молчаливый режим) для подавления ненужной информации.
Если mysqld остановлен, то следует использовать опцию --update-state для указания myisamchk отмечать таблицы как 'проверенные'(checked).
Ремонтировать следует только те таблицы, для которых myisamchk выдала ошибки. Для таких таблиц следует перейти к стадии 2.
Если во время проверки будут получены странные ошибки (подобные out of memory), или myisamchk завершится аварийно, то перейдите к стадии 3.
Стадия 2: легкий безопасный ремонт
Примечание: если есть желание ускорить ремонт, рекомендуется добавить: -O sort_buffer=# -O key_buffer=# (где # примерно 1/4 от имеющейся памяти) во всех командах isamchk/myisamchk.
Сначала надо попробовать запустить myisamchk -r -q tbl_name (-r -q означает "режим быстрого восстановления"). При этом будет сделана попытка исправить индексный файл без изменения файла данных. Если в файле данных содержится все необходимое, а удаленные связи указывают на правильные позиции в файле данных, то команда должна дать результат и таблица будет исправлена. Перейдите к ремонту следующей таблицы. В противном случае следует выполнить следующие действия:
Если во время проверки будут получены странные ошибки (подобные out of memory) или myisamchk аварийно завершается, то перейдите к стадии 3.
Стадия 3: сложный ремонт
До этой стадии дело доходит, только если первый 16-килобайтный блок в индексном файле разрушен или содержит неверную информацию, либо когда индексный файл отсутствует. В этом случае необходимо создать новый индексный файл. Необходимо выполнить следующие действия:
shell> mysql db_name mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE table_name; mysql> quitЕсли используемая версия SQL не располагает TRUNCATE TABLE, то взамен используется DELETE FROM table_name.
Вернитесь к стадии 2. myisamchk -r -q теперь должна сработать (но бесконечно повторять стадии не следует).
Что касается MySQL 4.0.2, то тут можно воспользоваться REPAIR ... USE_FRM, выполняющей всю эту процедуру автоматически.
Стадия 4: очень сложный ремонт
До этой стадии вы дойдете только в случае, если ко всему прочему запорчен и файл описания. Такого происходить не должно, поскольку файл описания после создания таблицы не изменяется. Выполните следующие действия: