15.7.3.2 Выполнение CHECK TABLE
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE проверяет таблицу или таблицы на наличие ошибок. CHECK TABLE также может проверять представления на наличие проблем, например, таблицы, на которые ссылается определение представления, но которые больше не существуют.
Для проверки таблицы необходимо иметь соответствующие привилегии.
CHECK TABLE работает с таблицами InnoDB, MyISAM, ARCHIVE и CSV.
Перед запуском CHECK TABLE на таблицах InnoDB, см. Примечания по использованию CHECK TABLE для таблиц InnoDB.
CHECK TABLE поддерживается для разнесенных по разделам таблиц, и вы можете использовать ALTER TABLE ...
CHECK PARTITION для проверки одного или нескольких разделов; для получения дополнительной информации см. Раздел 15.1.9, «Оператор ALTER TABLE» и Раздел 26.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. Table is already up to
date означает, что движок хранения таблицы указал, что проверка таблицы не требуется.
Проверка совместимости версий
Опция FOR UPGRADE проверяет, совместимы ли указанные таблицы с текущей версией MySQL. С помощью FOR UPGRADE сервер проверяет каждую таблицу, чтобы определить, были ли с момента создания таблицы несовместимые изменения в типах данных или индексах таблицы. Если нет, проверка проходит успешно. В противном случае, если есть возможная несовместимость, сервер выполняет полную проверку таблицы (что может занять некоторое время).
Несовместимости могут возникнуть из-за изменения формата хранения типа данных или порядка сортировки. Мы стремимся избегать таких изменений, но иногда они необходимы для исправления проблем, которые были бы хуже, чем несовместимость между выпусками.
FOR UPGRADE обнаруживает эти несовместимости:
Порядок индексирования для конечного пространства в
TEXTстолбцах для таблицInnoDBиMyISAMизменился между MySQL 4.1 и 5.0.Метод хранения нового типа данных
DECIMALизменился между MySQL 5.0.3 и 5.0.5.Иногда вносятся изменения в наборы символов или наборы правил сортировки, которые требуют перестроения индексов таблицы. Подробности об этих изменениях см. в Разделе 3.5, «Изменения в MySQL 9.2». Информацию о перестроении таблиц см. в Разделе 3.14, «Перестроение или ремонт таблиц или индексов».
MySQL 9.2 не поддерживает тип данных 2-значного
YEAR(2), разрешенный в более старых версиях MySQL. Для таблиц, содержащих столбцыYEAR(2),CHECK TABLEрекомендуетREPAIR TABLE, который преобразует столбцы с 2-значнымYEAR(2)в столбцы с 4-значнымYEAR.Время создания триггеров сохраняется.
Таблица сообщается о необходимости перестроения, если она содержит старые временные столбцы в формате до 5.6.4 (
TIME,DATETIMEиTIMESTAMPстолбцы без поддержки точности дробных секунд). Это помогает процедуре обновления MySQL обнаруживать и обновлять таблицы, содержащие старые временные столбцы.Выдаются предупреждения для таблиц, использующих нестандартное разбиение, так как нестандартное разбиение удалено в MySQL 9.2. См. Главу 26, «Разбиение».
Проверка согласованности данных
В следующей таблице показаны другие варианты проверок, которые можно задать. Эти параметры передаются в движок хранения данных, который может их использовать или игнорировать.
| Тип | Значение |
|---|---|
QUICK | Не сканировать строки для проверки неправильных ссылок. Применяется к таблицам и представлениям InnoDB и MyISAM. |
FAST | Проверять только таблицы, которые не были должным образом закрыты. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM. |
CHANGED | Проверять только таблицы, которые были изменены с момента последней проверки или не были должным образом закрыты. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM. |
MEDIUM | Сканировать строки для проверки того, что удаленные ссылки действительны. Это также вычисляет контрольную сумму ключа для строк и проверяет её с вычисленной контрольной суммой ключей. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM. |
EXTENDED | Выполнить полное поиск по всем ключам для каждой строки. Это гарантирует 100% согласованность таблицы, но занимает много времени. Игнорируется для InnoDB; применяется только к таблицам и представлениям MyISAM. |
Можно комбинировать параметры проверки, как в следующем примере, который выполняет быструю проверку таблицы для определения того, была ли она должным образом закрыта:
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.InnoDBподдерживает параллельное чтение индексов кластеризации, что может улучшить производительностьCHECK TABLE.InnoDBчитает индекс кластеризации дважды во время операцииCHECK TABLE. Второе чтение можно выполнить параллельно. Переменная сессииinnodb_parallel_read_threadsдолжна быть установлена в значение, большее 1, для выполнения параллельного чтения индексов кластеризации. Фактическое количество потоков, используемых для выполнения параллельного чтения индекса кластеризации, определяется значениемinnodb_parallel_read_threadsили количеством поддеревьев индекса для сканирования, что меньше.
Заметки по использованию CHECK TABLE для таблиц MyISAM
Следующие заметки относятся к таблицам MyISAM:
CHECK TABLEобновляет статистические данные ключей для таблицMyISAM.Если вывод
CHECK TABLEне возвращаетOKилиTable is already up to date, обычно следует выполнить ремонт таблицы. См. Раздел 9.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.