Spec-Zone.ru › MySQL 5.7

13.7.2.2 Оператор CHECK TABLE

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option: {
    FOR UPGRADE
  | QUICK
  | FAST
  | MEDIUM
  | EXTENDED
  | CHANGED
}

CHECK TABLE проверяет таблицу или таблицы на наличие ошибок. Для таблиц MyISAM также обновляются ключевые статистические данные. CHECK TABLE также может проверять представления на наличие проблем, таких как таблицы, на которые ссылается определение представления, но которые больше не существуют.

Для проверки таблицы у вас должны быть соответствующие привилегии.

CHECK TABLE работает с таблицами InnoDB, MyISAM, ARCHIVE и CSV.

Перед запуском CHECK TABLE для InnoDB таблиц, ознакомьтесь с Примечаниями к использованию CHECK TABLE для таблиц InnoDB.

CHECK TABLE поддерживается для разделяемых таблиц, и вы можете использовать ALTER TABLE ... CHECK PARTITION для проверки одной или нескольких секций; для получения более подробной информации, см. Раздел 13.1.8, «Оператор ALTER TABLE» и Раздел 22.3.4, «Обслуживание разделов».

CHECK TABLE игнорирует виртуальные сгенерированные столбцы, которые не индексированы.

  • Вывод CHECK TABLE

  • Проверка совместимости версий

  • Проверка согласованности данных

  • Примечания к использованию CHECK TABLE для таблиц InnoDB

  • Примечания к использованию CHECK TABLE для таблиц MyISAM

Вывод CHECK TABLE

CHECK TABLE возвращает набор результатов со столбцами, показанными в следующей таблице.

Столбец Значение
Table Имя таблицы
Op Всегда check
Msg_type status, error, info, note или warning
Msg_text Информационное сообщение

Оператор может выводить много строк информации для каждой проверяемой таблицы. В последней строке значение Msg_type равно status, а значение Msg_text обычно должно быть OK. Для таблицы MyISAM, если вы не получаете OK или Table is already up to date, вы обычно должны выполнить ремонт таблицы. См. Раздел 7.6, «Обслуживание таблиц MyISAM и восстановление после сбоев». Table is already up to date означает, что движок хранения таблицы указал, что нет необходимости проверять таблицу.

Проверка совместимости версий

Опция FOR UPGRADE проверяет, совместимы ли указанные таблицы с текущей версией MySQL. С помощью FOR UPGRADE сервер проверяет каждую таблицу, чтобы определить, были ли какие-либо несовместимые изменения в типах данных или индексах таблицы с момента ее создания. Если нет, проверка проходит успешно. В противном случае, если есть потенциальная несовместимость, сервер выполняет полную проверку таблицы (что может занять некоторое время). Если полная проверка проходит успешно, сервер помечает файл .frm таблицы номером текущей версии MySQL. Пометка файла .frm обеспечивает быстроту дальнейших проверок таблицы с той же версией сервера.

Несовместимости могут возникнуть из-за изменения формата хранения типа данных или порядка сортировки. Мы стремимся избегать этих изменений, но иногда они необходимы для исправления проблем, которые были бы хуже, чем несовместимость между выпусками.

FOR UPGRADE обнаруживает эти несовместимости:

  • Порядок индексации для конечного пространства в столбцах TEXT для таблиц InnoDB и MyISAM изменился между MySQL 4.1 и 5.0.

  • Метод хранения нового типа данных DECIMAL изменился между MySQL 5.0.3 и 5.0.5.

  • Если ваша таблица была создана другой версией сервера MySQL, чем та, которую вы используете в настоящее время, FOR UPGRADE указывает, что таблица имеет файл .frm с несовместимой версией. В этом случае набор результатов, возвращаемый CHECK TABLE, содержит строку со значением Msg_type равным error и значением Msg_text равным Table upgrade required. Please do "REPAIR TABLE `tbl_name`" to fix it!

  • Иногда вносятся изменения в наборы символов или сортировки, которые требуют перестроения индексов таблиц. Подробности об этих изменениях см. в Разделе 2.10.3, «Изменения в MySQL 5.7». Сведения о перестроении таблиц см. в Разделе 2.10.12, «Перестроение или ремонт таблиц или индексов».

  • Тип данных YEAR(2) устарел и его поддержка удалена в MySQL 5.7.5. Для таблиц, содержащих столбцы YEAR(2), CHECK TABLE рекомендует использовать REPAIR TABLE, который преобразует столбцы с 2-значными YEAR(2) в столбцы с 4-значными YEAR.

  • С MySQL 5.7.2 поддерживается время создания триггеров. Если операция выполняется с таблицей, содержащей триггеры, CHECK TABLE ... FOR UPGRADE отображает это предупреждение для каждого триггера, созданного до MySQL 5.7.2:

    Trigger db_name.tbl_name.trigger_name does not have CREATED attribute.
    

    Предупреждение является только информационным. Никаких изменений в триггере не производится.

  • С MySQL 5.7.7, таблица сообщается о необходимости перестройки, если она содержит старые временные столбцы в формате до 5.6.4 (TIME, DATETIME и TIMESTAMP столбцы без поддержки точности дробных секунд) и переменная сервера avoid_temporal_upgrade отключена. Это помогает процедуре обновления MySQL обнаруживать и обновлять таблицы, содержащие старые временные столбцы. Если avoid_temporal_upgrade включена, FOR UPGRADE игнорирует старые временные столбцы, присутствующие в таблице; в результате процедура обновления их не обновляет.

    Для проверки таблиц, содержащих такие временные столбцы и требующих перестройки, отключите avoid_temporal_upgrade перед выполнением CHECK TABLE ... FOR UPGRADE.

  • Выдаются предупреждения для таблиц, использующих нестандартное разбиение, так как нестандартное разбиение устарело в MySQL 5.7 и удалено в MySQL 8.0. См. Главу 22, Разбиение.

END_OF_DOCUMENT_MARKER
Проверка согласованности данных

В следующей таблице показаны другие опции проверки, которые можно задать. Эти опции передаются движку хранения, который может их использовать или игнорировать.

Тип Значение
QUICK Не сканировать строки для проверки некорректных ссылок. Применяется к таблицам и представлениям InnoDB и MyISAM.
FAST Проверить только таблицы, которые не были должным образом закрыты. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM.
CHANGED Проверить только таблицы, которые были изменены с момента последней проверки или которые не были должным образом закрыты. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM.
MEDIUM Сканировать строки для проверки того, что удалённые ссылки действительны. Это также вычисляет контрольную сумму ключей для строк и проверяет её с вычисленной контрольной суммой ключей. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM.
EXTENDED Выполнить полный поиск ключей для всех ключей каждой строки. Это гарантирует, что таблица на 100% согласована, но занимает много времени. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM.

Если ни одна из опций QUICK, MEDIUM или EXTENDED не указана, тип проверки по умолчанию для таблиц динамического формата MyISAM — MEDIUM. Это даёт тот же результат, что и выполнение myisamchk --medium-check tbl_name для таблицы. Тип проверки по умолчанию также является MEDIUM для таблиц статического формата MyISAM, если не указана CHANGED или FAST. В этом случае значение по умолчанию — QUICK. Сканирование строк пропускается для CHANGED и FAST, так как строки очень редко бывают повреждены.

Вы можете объединять опции проверки, как в приведённом ниже примере, который выполняет быструю проверку таблицы, чтобы определить, была ли она должным образом закрыта:

CHECK TABLE test_table FAST QUICK;
Примечание

Если CHECK TABLE не обнаруживает проблем в таблице, помеченной как “повреждённая” или “не должным образом закрытая”, CHECK TABLE может убрать метку.

Если таблица повреждена, проблема, скорее всего, в индексах, а не в части данных. Все перечисленные выше типы проверок тщательно проверяют индексы и, следовательно, должны обнаруживать большинство ошибок.

Чтобы проверить таблицу, которую, по вашему предположению, в порядке, не используйте опций проверки или опцию QUICK. Последняя должна использоваться, когда вы торопитесь и можете принять очень небольшой риск того, что QUICK не найдёт ошибку в файле данных. (В большинстве случаев, при нормальном использовании, MySQL должен находить любые ошибки в файле данных. Если это произойдёт, таблица помечается как «повреждённая» и не может использоваться до тех пор, пока не будет восстановлена.)

FAST и CHANGED в основном предназначены для использования из скрипта (например, для выполнения из cron) для периодической проверки таблиц. В большинстве случаев FAST предпочтительнее CHANGED. (Единственный случай, когда это не предпочтительно, — когда вы подозреваете, что нашли ошибку в коде MyISAM.)

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

Использование CHECK TABLE ... EXTENDED может повлиять на планы выполнения, генерируемые оптимизатором запросов.

Некоторые проблемы, сообщаемые CHECK TABLE, не могут быть автоматически исправлены:

  • Found row where the auto_increment column has the value 0.

    Это означает, что у вас есть строка в таблице, где столбец индекса AUTO_INCREMENT содержит значение 0. (Возможно создать строку, где столбец AUTO_INCREMENT равен 0, явно установив столбец в 0 с помощью оператора UPDATE.)

    Это само по себе не является ошибкой, но может вызвать проблемы, если вы решите выполнить дамп таблицы и восстановить её или выполнить ALTER TABLE над таблицей. В этом случае столбец AUTO_INCREMENT изменяет значение в соответствии с правилами столбцов AUTO_INCREMENT, что может вызвать проблемы, такие как ошибка дублирующего ключа.

    Чтобы избавиться от предупреждения, выполните оператор UPDATE для установки столбца в некоторое значение, отличное от 0.

Примечания по использованию CHECK TABLE для InnoDB таблиц

Следующие замечания относятся к таблицам InnoDB:

  • Если CHECK TABLE обнаруживает повреждённую страницу, сервер выходит из работы, чтобы предотвратить распространение ошибки (Ошибка #10132). Если повреждение происходит во вторичном индексе, но данные таблицы читабельны, выполнение CHECK TABLE всё ещё может привести к выходу сервера из строя.

  • Если CHECK TABLE обнаруживает повреждённое поле DB_TRX_ID или DB_ROLL_PTR в кластеризованном индексе, CHECK TABLE может привести к тому, что InnoDB обратится к недействительной записи журнала отката, что приведёт к выходу сервера из строя.

  • Если CHECK TABLE обнаруживает ошибки в таблицах или индексах InnoDB, он сообщает об ошибке и обычно помечает индекс, а иногда и таблицу как повреждённые, что предотвращает дальнейшее использование индекса или таблицы. Такие ошибки включают неправильное количество записей во вторичном индексе или некорректные ссылки.

  • Если CHECK TABLE обнаруживает неправильное количество записей во вторичном индексе, он сообщает об ошибке, но не приводит к выходу сервера из строя или не предотвращает доступ к файлу.

  • CHECK TABLE исследует структуру страницы индекса, затем исследует каждую запись ключа. Он не проверяет указатель ключа на запись кластера или не следует по пути для указателей BLOB.

  • Когда таблица InnoDB хранится в собственном файле, первые 3 блока файла .ibd содержат заголовки, а не данные таблицы или индекса. Оператор CHECK TABLE не обнаруживает несоответствия, которые влияют только на заголовки. Для проверки всего содержимого файла InnoDB .ibd используйте команду innochecksum.

  • При выполнении CHECK TABLE на больших таблицах InnoDB другие потоки могут блокироваться во время выполнения CHECK TABLE. Для предотвращения таймаутов порог ожидания семафора (600 секунд) увеличивается на 2 часа (7200 секунд) для операций CHECK TABLE. Если InnoDB обнаруживает ожидания семафора 240 секунд и более, он начинает выводить мониторинговые данные InnoDB в журнал ошибок. Если запрос блокировки продлевается дольше порога ожидания семафора, InnoDB прерывает процесс. Чтобы полностью избежать возможности таймаута ожидания семафора, выполните CHECK TABLE QUICK, а не CHECK TABLE.

  • CHECK TABLE функциональность для InnoDB SPATIAL индексов включает проверку корректности R-дерева и проверку соответствия количества строк R-дерева кластерному индексу.

  • CHECK TABLE поддерживает вторичные индексы на виртуальных вычисляемых столбцах, которые поддерживаются InnoDB.

Примечания по использованию CHECK TABLE для таблиц MyISAM

Следующие замечания относятся к таблицам MyISAM:

  • CHECK TABLE обновляет статистические данные ключей для таблиц MyISAM.

  • Если вывод CHECK TABLE не возвращает OK или Table is already up to date, обычно следует выполнить ремонт таблицы. См. Раздел 7.6, «Обслуживание таблиц MyISAM и восстановление после сбоев».

  • Если ни один из параметров CHECK TABLE QUICK, MEDIUM или EXTENDED не указан, тип проверки по умолчанию для таблиц динамического формата MyISAM — MEDIUM. Это равносильно выполнению команды myisamchk --medium-check tbl_name для таблицы. Тип проверки по умолчанию также равен MEDIUM для таблиц статического формата MyISAM, если не указано CHANGED или FAST. В этом случае значение по умолчанию — QUICK. Проверка строк пропускается для CHANGED и FAST, так как строки редко бывают повреждены.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/check-table.html

Spec-Zone.ru

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