7.6.3 Как восстановить таблицы MyISAM
В этом разделе описывается, как использовать утилиту myisamchk для таблиц MyISAM (расширения .MYI и .MYD).
Также можно использовать операторы CHECK TABLE и REPAIR TABLE для проверки и восстановления таблиц MyISAM. См. раздел 13.7.2.2, «Оператор CHECK TABLE» и раздел 13.7.2.5, «Оператор REPAIR TABLE».
Симптомы повреждённых таблиц включают внезапное прерывание запросов и наблюдаемые ошибки, такие как:
Таблица заблокирована для изменения
Не удалось найти файл
(код ошибки:tbl_name.MYInnn)Неожиданный конец файла
Файл записей повреждён
Получена ошибка
nnnот обработчика таблиц
Чтобы получить больше информации об ошибке, запустите perror nnn, где nnn — номер ошибки. Следующий пример демонстрирует использование perror для определения значений наиболее распространённых кодов ошибок, указывающих на проблему с таблицей:
$> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired
Обратите внимание, что ошибки 135 (нет места в файле записей) и 136 (нет места в файле индексов) не могут быть исправлены простым восстановлением. В этом случае необходимо использовать ALTER TABLE для увеличения значений параметров таблицы MAX_ROWS и AVG_ROW_LENGTH:
ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
Если текущие значения параметров таблицы неизвестны, используйте SHOW CREATE TABLE.
Для других ошибок необходимо восстановить таблицы. myisamchk обычно может обнаружить и исправить большинство проблем.
Процесс восстановления включает до четырёх этапов, описанных здесь. Перед началом измените директорию на директорию базы данных и проверьте права доступа к файлам таблиц. В Unix убедитесь, что они доступны для чтения пользователю, под которым работает mysqld (и для вас, так как вам нужно будет обращаться к проверяемым файлам). Если потребуется модифицировать файлы, они также должны быть доступны для записи.
Этот раздел предназначен для случаев, когда проверка таблицы завершилась неудачно (как описано в разделе 7.6.2, «Как проверить таблицы MyISAM на ошибки») или вы хотите воспользоваться расширенными возможностями myisamchk.
Параметры myisamchk для обслуживания таблиц описаны в разделе 4.6.3, «myisamchk — утилита обслуживания таблиц MyISAM». myisamchk также имеет переменные, которые можно задать для управления выделением памяти, что может улучшить производительность. См. раздел 4.6.3.6, «Использование памяти myisamchk».
Если вы собираетесь восстанавливать таблицу из командной строки, сначала необходимо остановить сервер mysqld. Обратите внимание, что при выполнении mysqladmin shutdown на удалённом сервере сервер mysqld остаётся доступным некоторое время после возврата mysqladmin, пока не завершатся все процессы обработки запросов и изменения индексов не будут сохранены на диске.
Этап 1: Проверка таблиц
Запустите myisamchk *.MYI или myisamchk -e *.MYI, если у вас есть больше времени. Используйте параметр -s (без вывода) для подавления ненужной информации.
Если сервер mysqld остановлен, используйте параметр --update-state, чтобы указать myisamchk на пометку таблицы как “проверенную.”
Необходимо восстанавливать только те таблицы, для которых myisamchk сообщает об ошибке. Для таких таблиц перейдите к Этапу 2.
Если при проверке возникают неожиданные ошибки (например, ошибки out
of memory) или myisamchk аварийно завершается, перейдите к Этапу 3.
Этап 2: Простое безопасное восстановление
Сначала попробуйте myisamchk -r -q tbl_name (-r
-q означает “быстрый режим восстановления”). Это попытается восстановить файл индекса, не затрагивая файл данных. Если файл данных содержит все необходимые данные, а ссылки на удаления указывают на правильные позиции в файле данных, это должно сработать, и таблица будет восстановлена. Переходите к следующей таблице. В противном случае, выполните следующие действия:
Сделайте резервную копию файла данных перед продолжением.
Используйте myisamchk -r
tbl_name(-rозначает “режим восстановления”). Это удалит неверные и удалённые строки из файла данных и восстановит файл индекса.Если предыдущий шаг не дал результата, используйте myisamchk --safe-recover
tbl_name. Режим безопасного восстановления использует старый метод восстановления, который обрабатывает несколько случаев, не обрабатываемых обычным режимом восстановления (но медленнее).
Для ускорения операции восстановления следует установить значения переменных sort_buffer_size и key_buffer_size примерно на 25% от доступной памяти при выполнении myisamchk.
Если при восстановлении возникают неожиданные ошибки (например, ошибки out of memory) или myisamchk аварийно завершается, перейдите к Этапу 3.
Этап 3: Сложное восстановление
Этот этап следует использовать только в случае повреждения первого 16-килобайтного блока файла индекса или если он содержит неверную информацию, или если файл индекса отсутствует. В этом случае необходимо создать новый файл индекса. Сделайте следующее:
Переместите файл данных в безопасное место.
-
Используйте файл описания таблицы для создания новых (пустых) файлов данных и индекса:
$>
mysqldb_namemysql>
SET autocommit=1;mysql>TRUNCATE TABLEmysql>tbl_name;quit Скопируйте старый файл данных в новый созданный файл данных. (Не просто переместите старый файл в новый. Вы хотите сохранить копию на случай ошибок.)
При использовании репликации её следует остановить перед выполнением вышеуказанной процедуры, поскольку она включает операции с файловой системой, которые не регистрируются MySQL.
Вернитесь к Этапу 2. myisamchk -r -q должно сработать. (Это не должно быть бесконечным циклом.)
END_OF_DOCUMENT_MARKER Также можно использовать оператор REPAIR TABLE
SQL, который выполняет всю процедуру автоматически. Также нет возможности нежелательного взаимодействия между утилитой и сервером, поскольку сервер выполняет всю работу при использовании tbl_name USE_FRMREPAIR TABLE. См. Раздел 13.7.2.5, «Оператор REPAIR TABLE».
Этап 4: Очень сложный ремонт
Вы должны достичь этого этапа только в том случае, если файл описания .frm также вышел из строя. Этого никогда не должно происходить, поскольку файл описания не изменяется после создания таблицы:
Восстановите файл описания из резервной копии и вернитесь к Этапу 3. Также можно восстановить файл индекса и вернуться к Этапу 2. В последнем случае необходимо начать с myisamchk -r.
Если у вас нет резервной копии, но вы точно знаете, как таблица была создана, создайте копию таблицы в другой базе данных. Удалите новый файл данных, а затем переместите файл описания
.frmи файлы индекса.MYIиз другой базы данных в вашу аварийную базу данных. Это даст вам новые файлы описания и индекса, но оставит файл данных.MYDбез изменений. Вернитесь к Этапу 2 и попытайтесь восстановить файл индекса.
© 2025 Oracle
Licensed under the GPLv2 License.