Spec-Zone .ru
спецификации, руководства, описания, API

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 Синтаксис".

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

Чтобы получить больше информации об ошибке, выполните perror nnn, где nnn код ошибки. Следующий пример показывает, как использовать perror, чтобы найти значения для наиболее распространенных кодов ошибки, которые указывают на проблему с таблицей:

shell> perror 126 127 132 134 135 136 141 144
        145MySQL error code 126 = Index file is crashedMySQL error code 127 = Record-file is crashedMySQL error code 132 = Old database fileMySQL error code 134 = Record was already deleted (or record file crashed)MySQL error code 135 = No more room in record fileMySQL error code 136 = No more room in index fileMySQL error code 141 = Duplicate unique key or constraint on write or updateMySQL error code 144 = Table is crashed and last repair failedMySQL 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 завершение работы на удаленном сервере, 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 - безопасный - восстанавливаются tbl_name. Безопасный режим восстановления использует старый метод восстановления, который обрабатывает несколько случаев, которые регулярный режим восстановления не делает (но медленнее).

Отметить

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

Если Вы получаете неожиданные ошибки, восстанавливая (такой как out of memory ошибки), или если myisamchk катастрофические отказы, идут, чтобы Подготовить 3.

Этап 3: Трудное восстановление

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

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

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

    shell> mysql db_namemysql> 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. См. Раздел 13.7.2.5,"REPAIR TABLE Синтаксис".

Этап 4: Очень трудное восстановление

Следует достичь этой стадии только если .frm файл описания также отказал. Это никогда не должно происходить, потому что файл описания не изменяется после того, как таблица составляется:

  1. Восстановите файл описания от резервного копирования и возвратитесь, чтобы Подготовить 3. Можно также восстановить индексный файл и возвратиться, чтобы Подготовить 2. В последнем случае следует запустить с myisamchk-r.

  2. Если Вы не имеете резервного копирования, но знаете точно, как таблица была составлена, создайте копию таблицы в другой базе данных. Удалите новый файл данных, и затем переместитесь .frm описание и .MYI индексные файлы от другой базы данных до Вашей разрушенной базы данных. Это дает Вам новое описание и индексные файлы, но листы .MYD один только файл данных. Возвратитесь, чтобы Подготовить 2 и попытаться восстановить индексный файл.