Использование myisamchk для послеаварийного восстановления
При выполнении mysqld со --skip-locking (установка по умолчанию в некоторых системах, подобных Linux) применение myisamchk для проверки таблицы, когда она используется mysqld , не совсем безопасно. Если есть уверенность, что никто не обратится к таблицам через mysqld во время выполнения myisamchk , то достаточно до начала проверки таблиц выполнить mysqladmin flush-tables , если нет - то на время проверки таблиц необходимо приостановить mysqld . При запуске myisamchk в то время, когда mysqld обновляет таблицы, может быть выдано предупреждение о повреждении таблицы - даже в случае, если этого не произошло.
Если --skip-locking не используется, то проверять таблицы с помощью myisamchk можно в любое время. Во время проверки все пытающиеся обновить таблицу клиенты получат возможность сделать это, только дождавшись готовности myisamchk .
Если myisamchk применяется для ремонта или оптимизации таблиц, то всегда необходимо обеспечить отсутствие обращений сервера mysqld к таблице (это также относится к случаю использования --skip-locking ). Если mysqld не может быть приостановлен, то до myisamchk , как минимум, надо выполнить mysqladmin flush-tables . Таблицы могут быть повреждены, если сервер и myisamchk обратятся к таблицам одновременно.
В данном разделе описывается, как выявлять повреждения данных в базах данных MySQL и что делать с повреждениями дальше. Если таблица повреждается часто, то надо постараться отыскать причину этих повреждений! Обращайтесь к разделу Что делать, если работа MySQL сопровождается постоянными сбоями.
Причины повреждения таблиц рассматриваются также в разделе по таблицам MyISAM . Обращайтесь к разделу Проблемы с таблицами MyISAM.
При выполнении послеаварийного восстановления важно понимать, что каждой таблице tbl_name в базе данных соответствуют три файла в каталоге базы данных:
Файл | Назначение | "tbl_name.frm" | Файл определения таблицы (формы) | "tbl_name.MYD" | Файл данных | 'tbl_name.MYI" | Индексный файл |
Каждый из этих трех типов файлов "имеет" свои виды повреждений, но наиболее часто проблемы возникают с файлами данных и индексными файлами.
Во время своей работы myisamchk построчно создает копию файла (данных) ".MYD". Стадия исправления завершается тем, что программа удаляет старый файл ".MYD" и переименовывает новый путем присвоения ему имени исходного. Если используется --quick , myisamchk не создает временного файла "."MYD , а, исходя из предположения, что файл ".MYD" правилен, только формирует новый индексный файл, никак не меняя файл "."MYD . Это безопасно, поскольку myisamchk автоматически распознает, что файл ".MYD" запорчен, и в этом случае прерывает исправление. Можно также задавать для myisamchk две опции --quick . В этом случае myisamchk не прерывается аварийно по некоторым ошибкам (таким как дублирование ключа), а пытается исправить их путем модификации файла ".MYD". Обычно использование двух опций --quick имеет смысл только в случае, если свободного места на диске недостаточно для выполнения нормального исправления. Тогда перед запуском myisamchk следует по крайней мере выполнить резервное копирование.
Как проверять таблицы на ошибки
Для проверки таблицы MyISAM используются следующие команды:
myisamchk tbl_name
Находит 99,99% всех ошибок. Не в состоянии отыскать повреждений, затрагивающих только файл данных (которые весьма необычны). Если необходимо только проверить таблицу, то обычно следует выполнить myisamchk без опций либо с одной из опций -s или --silent.
myisamchk -m tbl_name
Находит 99,999% всех ошибок. Сначала на ошибки проверяются все индексные элементы, а затем читаются все строки подряд. Программа вычисляет контрольную сумму для всех ключей в строке и проверяет, совпадает ли она с контрольной суммой в индексном дереве.
myisamchk -e tbl_name
В этом случае выполняется полная и тщательная проверка всех данных (-e означает "расширенная проверка"). Происходит тестовое чтение каждого ключа для каждой строки с целью контроля того, что ключи указывают на нужные строки. Для большой таблицы с множеством ключей на это может потребоваться много времени. myisamchk обычно останавливается после обнаружения первой ошибки, но если желательно получить более подробную информацию, можно добавить опцию --verbose (-v ) - таким образом выполнение myisamchk будет продолжаться вплоть до максимума в 20 ошибок. При нормальной работе достаточно просто запустить myisamchk (без аргументов за исключением имени таблицы).
myisamchk -e -i tbl_name
Аналогична предыдущей команде, но опция -i указывает myisamchk дополнительно отображать некоторую статистическую информацию.
1 2 3 4 5 6 7
8 8 8
| |