Настройка режима профилактики таблиц
Начиная с версии MySQL 3.23.13 можно проверять таблицы типа MyISAM с помощью команды CHECK TABLE (см. раздел ). Для ремонта таблиц можно использовать команду REPAIR TABLE (см. раздел ).
Целесообразно выполнять регулярные проверки таблиц, не дожидаясь появления проблем. В целях профилактики для проверки таблиц можно использовать myisamchk -s . Опция -s (сокращение для --silent ) задает выполнение
myisamchk в молчаливом режиме с выдачей сообщений только при возникновении ошибок.
Не стоит сбрасывать со счетов и выполнение проверки таблиц при запуске сервера. Например, всякий раз, когда во время обновления происходит перезагрузка, необходима проверка всех таблиц, которые могли при этом пострадать (назовем их "потенциально поврежденными таблицами"). В safe_mysqld можно добавить тест, запускающий myisamchk для проверки всех таблиц, измененных за последние 24 часа, в случае, если после перезагрузки остался старый файл ".pid" (ID процесса) (mysqld создает "."pid -файл во время запуска и удаляет его при нормальном завершении; наличие ".pid"-файла во время запуска системы свидетельствует о том, что mysqld не завершился нормально).
Можно сделать даже более надежный тест - выполнить проверку таблиц с более поздней, чем у '.pid"-файла, датой последней модификации.
Таблицы также следует регулярно проверять в ходе нормального функционирования системы. У себя в MySQL AB мы запускаем задачи по cron для проверки всех наших важных таблиц раз в неделю, используя следующую строку в файле crontab :
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
Такая команда отображает информацию о поврежденных таблицах, и мы при надобности можем их исследовать и исправить.
Поскольку за последние пару лет у нас (на самом деле) не было неожиданно поврежденных таблиц (таблиц, получивших повреждение по причинам, отличным от неисправностей оборудования), то для нас проверки один раз в неделю более чем достаточно.
Мы рекомендуем для начала выполнять myisamchk -s еженощно на всех таблицах, обновленных на протяжении последних 24 часов, пока вы не станете доверять MySQL настолько, насколько доверяем мы.
Обычно в таком контроле над таблицами MySQL необходимости нет. При изменении таблиц с динамическим размером строк (таблиц со столбцами типов VARCHAR , BLOB или TEXT ) или при наличии таблиц с большим числом удаленных строк может потребоваться время от времени (где-то раз в месяц) дефрагментировать таблицы.
Это можно сделать, используя OPTIMIZE TABLE на аналогичных таблицах, или, если есть возможность приостановить mysqld , выполняя:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI
Получение информации о таблице
Команды, представленные в этом разделе, используются для получения описания таблицы или статистики по таблице. Более подробное выборочное разъяснение вывода этих команд будет приведено ниже:
myisamchk -d tbl_name Выполняет myisamchk в "описательном режиме" для вывода описания таблицы. Если MySQL использует опцию --skip-locking , то myisamchk может сообщить об ошибке для таблицы, обновляемой во время исполнения утилиты. Однако поскольку myisamchk не меняет таблицы в описательном режиме, то никакого риска разрушения данных нет.
myisamchk -d -v tbl_name Для выдачи дополнительной информации по действиям, выполняемым утилитой myisamchk , добавляется -v для указания расширенного режима вывода сообщений.
myisamchk -eis tbl_name Отображается только наиболее важная информация из таблицы. Работает медленно вследствие того, что приходится считывать всю таблицу.
myisamchk -eiv tbl_name То же, что и -eis , но с сообщением о выполняемых действиях.
Пример вывода myisamchk -d :
MyISAM file: company.MYI Record format: Fixed length Data records: 1403698 Deleted blocks: 0 Recordlength: 226
table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text
Пример вывода myisamchk -d -v :
MyISAM file: company Record format: Fixed length File-version: 1 Creation time: 1999-10-30 12:12:51 Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226
table description: Key Start Len Index Type Rec/key Root Blocksize 1 2 8 unique double 1 15845376 1024 2 15 10 multip. text packed stripped 2 25062400 1024 3 219 8 multip. double 73 40907776 1024 4 63 10 multip. text packed stripped 5 48097280 1024 5 167 2 multip. unsigned short 4840 55200768 1024 6 177 4 multip. unsigned long 1346 65145856 1024 7 155 4 multip. text 4995 75090944 1024 8 138 4 multip. unsigned long 87 85036032 1024 9 177 4 multip. unsigned long 178 96481280 1024 193 1 text
Пример вывода myisamchk -eis :
Checking MyISAM file: company Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 98% Packed: 17%
Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0
User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966
Пример вывода myisamchk -eiv :
Checking MyISAM file: company Data records: 1403698 Deleted blocks: 0 - check file-size - check delete-chain block_size 1024: index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks - check index reference - check data record references index: 1 Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 2 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 - check data record references index: 3 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 - check data record references index: 5 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 6 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 7 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 8 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 9 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 9% Packed: 17%
- check records and index references [кое-что опущено для краткости]
Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0
User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798
Для использованной в предыдущих примерах таблицы размеры файла данных и индексного файла были следующими:
-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD -rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYM
Ниже приводятся пояснения по различным типам выдаваемой myisamchk информации. "keyfile" означает индексный файл. Record" (запись) и "row" (строка) являются синонимами:
ISAM file - Имя (индексного) файла ISAM.
Isam-version - Версия формата ISAM. На данный момент всегда 2.
Creation time - Время создания файла данных.
Recover time - Дата последнего восстановления индексного файла/файла данных.
Data records - Количество записей в таблице.
Deleted blocks - Количество удаленных блоков, пространство для которых все еще зарезервировано. Таблицу можно оптимизировать для сведения к минимуму этого пространства (см. раздел Оптимизация таблиц).
Datafile parts - Для динамического формата записей показывает количество блоков данных. Для оптимизированной таблицы без фрагментированных записей совпадает с Data records .
Deleted data - Количество байтов удаленных данных, которые не были затребованы. Можно оптимизировать таблицу, чтобы сделать этот объем минимальным (см. раздел Оптимизация таблиц).
Data file pointer - Размер указателя в файле данных (в байтах). Обычно это 2, 3, 4 или 5 байтов. Для большинства таблиц достаточно 2 байтов, но назначение размера пока невозможно контролировать из MySQL. Для фиксированных таблиц указатель - это адрес записи, а для динамических - адрес байта.
Keyfile pointer - Размер указателя индексного файла в байтах. Обычно составляет 1, 2 или 3 байта. Для большинства таблиц хватает 2 байтов, но размер автоматически вычисляется MySQL. Указатель всегда является адресом блока.
Max datafile length - Максимальный размер файла данных таблицы (".MYD"-файл) в байтах.
Max keyfile length - Максимальный размер индексного файла таблицы (".MYI-файла") в байтах.
Recordlength - Размер отдельной записи в байтах.
Record format - Формат, используемый для хранения строк таблицы. В примерах, приведенных выше, использовался формат Fixed length . Другие возможные значения: Compressed и Packed .
table description - Список всех ключей в таблице. Для каждого ключа представляется некоторая низкоуровневая информация:
Key Номер данного ключа.
Start Место в записи, где начинается данная часть индекса.
Len Длина данной части индекса. Для упакованных чисел длина всегда должна равняться полной длине для столбца. Для строк длина может быть меньше полной длины индексированной колонки, поскольку допускается индексирование префикса столбца со значениями строками.
Индекс unique или multip . (multiple - повторяющийся/многократный) Показывает, может ли одно значение встречаться в индексе многократно.
Type Тип данных данной части индекса. Это тип данных ISAM с возможными вариантами - packed , stripped и empty .
Root Адрес корневого индексного блока.
Blocksize Размер каждого индексного блока. По умолчанию равен 1024, но значение можно изменить во время компиляции.
Rec/key Статистическое значение, используемое оптимизатором. Оно показывает, сколько записей приходится на одно значение для данного ключа. Для уникального ключа это соотношение всегда 1. Значение может быть обновлено после загрузки таблицы (или значительного ее изменения) посредством myisamchk -a . Если соотношение совсем не обновляется, то по умолчанию принимается значение 30.
В первом из приведенных примеров 9-й ключ является составным с двумя частями.
Keyblocks used - Процент использованных блоков ключей. Поскольку для примера была взята таблица, совсем недавно реорганизованная при помощи
myisamchk , то значения очень высоки (очень близки к теоретическому максимуму).
Packed - MySQL пытается упаковывать ключи с общим суффиксом. Это может быть использовано только для ключей типа CHAR /VARCHAR /DECIMAL . Для длинных строк, таких как имена, при помощи упаковки можно значительно уменьшить занимаемое ими место. В третьем из приведенных примеров 4-й ключ состоит из 10 символов и для него достигнуто 60%-е уменьшение в объеме.
Max levels - Глубина B-дерева для данного ключа. В больших таблицах с длинными ключами значение является большим.
Records Количество строк в таблице.
M.recordlength - Средняя длина записи. Для таблиц с фиксированной длиной записи равняется точной длине записи.
Packed - MySQL отбрасывает пробелы в конце строк. Значение Packed указывает на процент достигнутой этим экономии.
Recordspace used - Процент использования файла данных.
Empty space - На сколько процентов файл данных не использован.
Blocks/Record - Среднее число блоков на запись (т.е. из какого числа связей состоит фрагментированная запись). Отношение всегда 1,0 для таблиц фиксированного формата. Важно, чтобы это значение было как можно ближе к 1,0. Если значение становится слишком большим, можно реорганизовать таблицу с помощью myisamchk . Обращайтесь к разделу Оптимизация таблиц.
Recordblocks - Количество использованных блоков (связей). Для фиксированного формата совпадает с количеством записей.
Deleteblocks - Количество удаленных блоков (связей).
Recorddata - Количество использованных байтов в файле данных.
Deleted data - Количество удаленных (неиспользуемых) байтов в файле данных.
Lost space - Если запись при обновлении уменьшается, то теряется некоторое пространство. Данное значение является суммой всех таких потерь в байтах.
Linkdata - При использовании динамического формата таблиц фрагменты записи связываются с помощью указателей (каждый от 4 до 7 байтов).
Linkdata - общий объем памяти, занимаемый всеми такими указателями.
Если таблица была сжата при помощи myisampack , то myisamchk -d выдает дополнительную информацию о каждом столбце в таблице. Обращайтесь к разделу myisampack, MySQL-генератор сжатых таблиц (только для чтения), где приведен пример такой информации и пояснение к ней.
1 2 3 4 5 6 7
8 8 8
| |