13.7.2.2 CHECK TABLE 语句

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

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

CHECK TABLE检查一个或多个 table 中是否有错误。对于MyISAMtable,键统计信息也会更新。 CHECK TABLE还可以检查视图是否存在问题,例如视图定义中引用的 table 不再存在。

要检查 table,您必须具有一些特权。

CHECK TABLE适用于InnoDBMyISAMARCHIVECSVtable。

InnoDB个 table 上运行CHECK TABLE之前,请参见检查 tableInnoDBtable 的使用说明

分区 table 支持CHECK TABLE,并且您可以使用ALTER TABLE ... CHECK PARTITION检查一个或多个分区;有关更多信息,请参见第 13.1.8 节“ ALTER TABLE 语句”第 22.3.4 节“分区维护”

CHECK TABLE忽略未索引的虚拟生成的列。

CHECK TABLE 输出

CHECK TABLE返回具有下 table 所示列的结果集。

Column Value
Table table 名
Op 一律check
Msg_type statuserrorinfonotewarning
Msg_text 信息性消息

该语句可能为每个检查的 table 产生许多行信息。最后一行的Msg_type值为status,而Msg_text通常应为OK。对于MyISAMtable,如果没有OKTable is already up to date,则通常应修复该 table。参见第 7.6 节“ MyISAMtable 维护和崩溃恢复”Table is already up to datetable 示 table 的存储引擎指示不需要检查 table。

检查版本兼容性

FOR UPGRADE选项检查命名 table 是否与当前版本的 MySQL 兼容。使用FOR UPGRADE,服务器将检查每个 table,以确定自创建 table 以来,table 的任何数据类型或索引中是否存在任何不兼容的更改。如果不是,则检查成功。否则,如果存在不兼容的情况,服务器将对 table 进行全面检查(这可能需要一些时间)。如果完全检查成功,服务器将使用当前的 MySQL 版本号标记 table 的.frm文件。标记.frm文件可确保对具有相同服务器版本的 table 进行进一步检查将很快。

由于数据类型的存储格式已更改或其排序 Sequences 已更改,因此可能会出现不兼容性。我们的目的是避免这些更改,但是有时它们对于纠正比发行版之间的不兼容性更严重的问题是必要的。

FOR UPGRADE发现以下不兼容之处:

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

该警告仅供参考。触发器没有任何变化。

要检查包含此类临时列且需要重建的 table,请在执行检查 table...升级之前禁用avoid_temporal_upgrade

检查数据一致性

下 table 显示了可以提供的其他检查选项。这些选项将传递到存储引擎,该引擎可以使用或忽略它们。

Type Meaning
QUICK 不要扫描行以检查链接是否不正确。适用于InnoDBMyISAMtable 和视图。
FAST 仅检查尚未正确关闭的 table。忽略InnoDB;仅适用于MyISAM个 table 和视图。
CHANGED 仅检查自上次检查以来已更改的 table 或未正确关闭的 table。忽略InnoDB;仅适用于MyISAM个 table 和视图。
MEDIUM 扫描行以确认删除的链接有效。这还将计算行的密钥校验和,并使用计算出的密钥校验和进行校验。忽略InnoDB;仅适用于MyISAM个 table 和视图。
EXTENDED 对每一行的所有键进行全键查找。这样可以确保 table 是 100%一致的,但是要花费很长时间。忽略InnoDB;仅适用于MyISAM个 table 和视图。

如果未指定选项QUICKMEDIUMEXTENDED,则动态格式MyISAMtable 的默认检查类型为MEDIUM。这与在 table 上运行myisamchk --medium-check tbl_name的结果相同。对于静态格式的MyISAMtable,默认的检查类型也是MEDIUM,除非指定了CHANGEDFAST。在这种情况下,默认值为QUICKCHANGEDFAST的行扫描被跳过,因为行很少被破坏。

您可以组合检查选项,如以下示例中所示,该示例对 table 进行快速检查以确定是否正确关闭了 table:

CHECK TABLE test_table FAST QUICK;

Note

如果CHECK TABLE发现标记为“损坏”或“未正确关闭”的 table 没有问题,则CHECK TABLE可能会删除该标记。

如果 table 已损坏,则问题很可能出在索引而不是数据部分。前面所有检查类型均会彻底检查索引,因此应发现大多数错误。

要检查您认为可以的 table,请使用无检查选项或QUICK选项。急忙时应使用后者,这样冒着很小的风险,即QUICK在数据文件中找不到错误。 (在大多数情况下,在正常使用下,MySQL 应该在数据文件中发现任何错误.如果发生这种情况,该 table 将标记为“已损坏”,并且只有在修复后才能使用.)

FASTCHANGED主要用于从脚本中使用(例如,从 cron 执行)以定期检查 table。在大多数情况下,FASTCHANGED更可取。 (唯一不受欢迎的情况是怀疑您在MyISAM代码中发现了错误.)

EXTENDED仅在运行常规检查后使用,但是当 MySQL 尝试更新行或通过键查找行时,仍然会从 table 中获取错误。如果正常检查成功,这是极不可能的。

检查 table...扩展的使用可能会影响查询优化器生成的执行计划。

CHECK TABLE报告的某些问题无法自动纠正:

这意味着您在 table 中有一行,其中AUTO_INCREMENT索引列包含值 0.(可以通过使用UPDATE语句将列显式设置为 0,来创建AUTO_INCREMENT列为 0 的行。)

这本身不是错误,但是如果您决定转储 table 并还原它或对 table 执行ALTER TABLE,则可能会引起麻烦。在这种情况下,AUTO_INCREMENT列会根据AUTO_INCREMENT列的规则更改值,这可能会导致诸如重复键错误之类的问题。

要消除警告,请执行UPDATE语句以将列设置为 0 以外的其他值。

InnoDBtable 的检查 table 使用说明

以下说明适用于InnoDB个 table:

MyISAMtable 的检查 table 使用说明

以下说明适用于MyISAM个 table:

首页