Spec-Zone.ru › MySQL 8.4

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 для таблиц 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. 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 8.4». Сведения о перестроении таблиц см. в Разделе 3.14, «Перестройка или ремонт таблиц или индексов».

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

  • Время создания триггера сохраняется.

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

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

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

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

Тип Значение
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 функциональность для индексов InnoDB SPATIAL включает проверку валидности 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 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-8.4-en/check-table.html

Spec-Zone.ru

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