4.4.6.8 Как проверять таблицы на ошибки | Оглавление | 4.4.6.10 Оптимизация таблиц |
В данном разделе рассматривается только использование myisamchk
на
таблицах MyISAM
(расширения `.MYI' и `.MYD'). Если же в системе применяются
таблицы ISAM
(расширения `.'ISM
и `.'ISD
), то следует пользоваться isamchk
.
Начиная с версии MySQL 3.23.14 можно ремонтировать таблицы MyISAM
при
помощи команды REPAIR TABLE
(see section 4.4.5 Синтаксис REPAIR TABLE
).
К симптомам повреждения таблицы относятся неожиданные прерывания выполнения запросов и появление следующих ошибок:
perror
###. Чаще всего о проблемах с таблицей свидетельствуют
следующие ошибки:
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
означает "режим быстрого восстановления"). При этом будет сделана попытка
исправить индексный файл без изменения файла данных. Если в файле данных
содержится все необходимое, а удаленные связи указывают на правильные
позиции в файле данных, то команда должна дать результат и таблица будет
исправлена. Перейдите к ремонту следующей таблицы. В противном случае
следует выполнить следующие действия:
myisamchk -r tbl_name
(-r
означает "режим
восстановления"). При этом из файла данных будут удалены некорректные
и уничтоженные записи, и будет заново создан индексный файл.
myisamchk --safe-recover tbl_name
. В режиме безопасного восстановления
используется старый метод восстановления, справляющийся с некоторыми
случаями, которые оказываются не под силу для режима обычного
исправления (но работает этот метод медленнее).
Если во время проверки будут получены странные ошибки (подобные 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: очень сложный ремонт
До этой стадии вы дойдете только в случае, если ко всему прочему запорчен и файл описания. Такого происходить не должно, поскольку файл описания после создания таблицы не изменяется. Выполните следующие действия:
myisamchk -r
.
4.4.6.8 Как проверять таблицы на ошибки | Оглавление | 4.4.6.10 Оптимизация таблиц |