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.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 (и вами, так как вам нужно получить доступ к проверяемым файлам). Если потребуется изменение файлов, они также должны быть доступны для записи.
Этот раздел предназначен для случаев, когда проверка таблицы завершается неудачно (например, как описано в Разделе 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 означает “режим быстрого восстановления”). Это попытка восстановить файл индекса, не затрагивая файл данных. Если файл данных содержит всё необходимое и ссылки на удалённые записи указывают на правильные места в файле данных, это должно сработать, и таблица будет восстановлена. Приступайте к восстановлению следующей таблицы. В противном случае следуйте процедуре:
Создайте резервную копию файла данных, прежде чем продолжить.
Используйте 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 должно сработать. (Это не должно быть бесконечным циклом.)
Вы также можете использовать инструкцию REPAIR TABLE
SQL, которая выполняет всю процедуру автоматически. Также нет возможности нежелательного взаимодействия между утилитой и сервером, так как сервер выполняет всю работу при использовании tbl_name USE_FRMREPAIR TABLE. См. Раздел 15.7.3.5, «Инструкция REPAIR TABLE».
© 2025 Oracle
Licensed under the GPLv2 License.