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 возвращает набор результатов со столбцами, показанными в следующей таблице.
| Столбец | Значение |
|---|---|
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_namedoes 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, Разбиение.
Проверка согласованности данных
В следующей таблице показаны другие опции проверки, которые можно задать. Эти опции передаются движку хранения, который может их использовать или игнорировать.
| Тип | Значение |
|---|---|
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функциональность дляInnoDBSPATIALиндексов включает проверку корректности 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 TABLEQUICK,MEDIUMилиEXTENDEDне указан, тип проверки по умолчанию для таблиц динамического форматаMyISAM—MEDIUM. Это равносильно выполнению команды myisamchk --medium-checktbl_nameдля таблицы. Тип проверки по умолчанию также равенMEDIUMдля таблиц статического форматаMyISAM, если не указаноCHANGEDилиFAST. В этом случае значение по умолчанию —QUICK. Проверка строк пропускается дляCHANGEDиFAST, так как строки редко бывают повреждены.
© 2025 Oracle
Licensed under the GPLv2 License.