Spec-Zone.ru › MySQL 8.4

9.6.3 Как восстановить таблицы MyISAM

В этом разделе описывается использование myisamchk для таблиц формата MyISAM (расширения .MYI и .MYD).

Также можно использовать операторы CHECK TABLE и REPAIR TABLE для проверки и восстановления таблиц MyISAM. См. Раздел 15.7.3.2, «Оператор CHECK TABLE» и Раздел 15.7.3.5, «Оператор REPAIR TABLE».

Признаками поврежденных таблиц являются неожиданные прерывания запросов и ошибки, такие как:

  • Не удалось найти файл tbl_name.MYI (Код ошибки: nnn)

  • Неожиданный конец файла

  • Файл записей поврежден

  • Получена ошибка 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 (и для вас, так как вам нужно получить доступ к файлам, которые вы проверяете). Если вам потребуется изменить файлы, убедитесь, что они также доступны для записи.

Этот раздел предназначен для случаев, когда проверка таблицы завершается ошибкой (как описано в Разделе 9.6.2, «Как проверить таблицы MyISAM на ошибки») или если вы хотите использовать расширенные функции, которые предоставляет myisamchk.

Параметры myisamchk для обслуживания таблиц описаны в Разделе 6.6.4, «myisamchk — Утилита обслуживания таблиц MyISAM». myisamchk также имеет переменные, которые можно установить для управления распределением памяти, что может улучшить производительность. См. Раздел 6.6.4.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 означает «быстрый режим восстановления»). Эта команда пытается восстановить индексный файл, не затрагивая файл данных. Если файл данных содержит все необходимые данные и ссылки на удалённые строки указывают на правильные места в файле данных, то это сработает, и таблица будет восстановлена. Приступайте к восстановлению следующей таблицы. В противном случае выполните следующие действия:

  1. Сделайте резервную копию файла данных перед продолжением.

  2. Используйте myisamchk -r tbl_name (-r означает «режим восстановления»). Эта команда удаляет некорректные и удалённые строки из файла данных и восстанавливает индексный файл.

  3. Если предыдущий шаг завершился ошибкой, используйте myisamchk --safe-recover tbl_name. Режим безопасного восстановления использует старый метод восстановления, который обрабатывает несколько случаев, которые не обрабатывает обычный режим восстановления (но работает медленнее).

Примечание

Если вы хотите, чтобы операция восстановления проходила быстрее, установите значения переменных sort_buffer_size и key_buffer_size примерно на 25% от доступной памяти при запуске myisamchk.

Если при восстановлении возникнут непредвиденные ошибки (например, ошибки out of memory) или myisamchk аварийно завершит работу, перейдите к Этапу 3.

Этап 3: Сложное восстановление

Этот этап следует использовать только в том случае, если первый 16-килобайтный блок в индексном файле повреждён или содержит неверную информацию, или если индексный файл отсутствует. В этом случае необходимо создать новый индексный файл. Для этого выполните следующие действия:

  1. Переместите файл данных в безопасное место.

  2. Используйте файл описания таблицы для создания новых (пустых) файлов данных и индексов:

    $> mysql db_name
    
    mysql> SET autocommit=1;
    mysql> TRUNCATE TABLE tbl_name;
    mysql> quit
    
  3. Скопируйте старый файл данных в новый файл данных. (Не просто переместите старый файл в новый. Вам нужна копия на случай возникновения проблем.)

Важно

Если используется репликация, её следует остановить перед выполнением указанной процедуры, так как она включает операции с файловой системой, которые не регистрируются MySQL.

Вернитесь к Этапу 2. myisamchk -r -q должно сработать. (Это не должно быть бесконечным циклом.)

Также можно использовать оператор REPAIR TABLE tbl_name USE_FRM SQL, который выполняет всю процедуру автоматически. Кроме того, нет возможности для нежелательного взаимодействия утилиты и сервера, так как сервер выполняет всю работу при использовании REPAIR TABLE. См. Раздел 15.7.3.5, «Оператор REPAIR TABLE».

END_OF_DOCUMENT_MARKER

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/myisam-repair.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API