文档主页
MySQL 9.0 参考手册
相关文档 下载本手册

MySQL 9.0 参考手册  /  ...  /  CHECK TABLE 语句

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 适用于 InnoDBMyISAMARCHIVECSV 表。

在对 InnoDB 表运行 CHECK TABLE 之前,请参阅 CHECK TABLE 对 InnoDB 表的使用说明.

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

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

CHECK TABLE 输出

CHECK TABLE 返回一个结果集,其中包含以下表格中所示的列。

表名
Op 始终为 check
Msg_type statuserrorinfonotewarning
Msg_text 信息消息

该语句可能会为每个检查的表生成许多行信息。最后一行具有 Msg_type 值为 status,并且 Msg_text 通常应为 OKTable is already up to date 表示表的存储引擎表明无需检查该表。

检查版本兼容性

FOR UPGRADE 选项检查命名表是否与当前版本的 MySQL 兼容。使用 FOR UPGRADE,服务器会检查每个表,以确定自创建表以来,该表的数据类型或索引中是否存在任何不兼容的更改。如果不存在,则检查成功。否则,如果存在可能的兼容性问题,服务器将在表上运行完整检查(这可能需要一些时间)。

不兼容性可能发生,因为数据类型的存储格式已更改,或者因为其排序顺序已更改。我们的目标是避免这些更改,但偶尔需要进行这些更改来更正比版本之间不兼容更严重的问题。

FOR UPGRADE 会发现这些不兼容性

  • 在 MySQL 4.1 和 5.0 之间,TEXT 列的尾部空格的索引顺序已更改,适用于 InnoDBMyISAM 表。

  • 在 MySQL 5.0.3 和 5.0.5 之间,新的 DECIMAL 数据类型的存储方法已更改。

  • 有时会对字符集或排序规则进行更改,这些更改需要重建表索引。有关此类更改的详细信息,请参见 第 3.5 节,“MySQL 9.0 中的更改”。有关重建表的更多信息,请参见 第 3.14 节,“重建或修复表或索引”

  • MySQL 9.0 不支持旧版 MySQL 中允许的 2 位数的 YEAR(2) 数据类型。对于包含 YEAR(2) 列的表,CHECK TABLE 建议使用 REPAIR TABLE,该语句会将 2 位数的 YEAR(2) 列转换为 4 位数的 YEAR 列。

  • 维护触发器的创建时间。

  • 如果表包含旧的时态列(以 5.6.4 之前的格式表示)(TIMEDATETIMETIMESTAMP 列不支持小数秒精度),则该表将被报告为需要重建。这有助于 MySQL 升级过程检测并升级包含旧时态列的表。

  • 对于使用非原生分区的表,会发出警告,因为非原生分区在 MySQL 9.0 中已被删除。请参见 第 26 章,分区

检查数据一致性

下表显示了可以指定的其他检查选项。这些选项将传递给存储引擎,存储引擎可能会使用或忽略这些选项。

类型 含义
QUICK 不扫描行以检查不正确的链接。适用于 InnoDBMyISAM 表和视图。
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 应该能在数据文件中找到任何错误。如果发生这种情况,则该表将被标记为 损坏,并且在修复之前无法使用。)

FASTCHANGED 主要用于脚本(例如,从 cron 执行)中定期检查表。在大多数情况下,FASTCHANGED 更受欢迎。(唯一不推荐它的情况是当您怀疑在 MyISAM 代码中找到了错误。)

EXTENDED 仅在您运行了正常检查但 MySQL 在尝试更新行或通过键查找行时仍然从表中获得错误时使用。如果正常检查成功,这种情况非常不可能发生。

使用 CHECK TABLE ... EXTENDED 可能会影响查询优化器生成的执行计划。

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

  • 发现自增列值为 0 的行.

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

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

    要消除警告,请执行 UPDATE 语句,将列设置为除 0 之外的某个值。

CHECK TABLE 对 InnoDB 表的使用说明

以下说明适用于 InnoDB

  • 如果 CHECK TABLE 遇到损坏的页面,服务器将退出以防止错误传播(错误 #10132)。如果损坏发生在辅助索引中,但表数据可读,则运行 CHECK TABLE 仍然会导致服务器退出。

  • 如果 CHECK TABLE 在聚簇索引中遇到损坏的 DB_TRX_IDDB_ROLL_PTR 字段,CHECK TABLE 可能会导致 InnoDB 访问无效的回滚日志记录,从而导致与 MVCC 相关的服务器退出。

  • 如果 CHECK TABLEInnoDB 表或索引中遇到错误,它会报告错误,通常会将索引标记为损坏,有时还会将表标记为损坏,从而阻止进一步使用索引或表。此类错误包括辅助索引中的条目数量错误或链接错误。

  • 如果 CHECK TABLE 发现辅助索引中的条目数量错误,它会报告错误,但不会导致服务器退出或阻止访问文件。

  • CHECK TABLE 会检查索引页结构,然后检查每个键条目。它不会验证指向聚簇记录的键指针,也不会遵循指向 BLOB 指针的路径。

  • InnoDB 表存储在其自己的 .ibd 文件 中时,.ibd 文件的前 3 个 包含标头信息,而不是表或索引数据。 CHECK TABLE 语句不会检测仅影响标头数据的冲突。要验证整个 InnoDB .ibd 文件的内容,请使用 innochecksum 命令。

  • 在大型 InnoDB 表上运行 CHECK TABLE 时,其他线程可能会在 CHECK TABLE 执行期间被阻塞。为了避免超时,信号量等待阈值 (600 秒) 会在 CHECK TABLE 操作期间延长 2 小时 (7200 秒)。如果 InnoDB 检测到信号量等待时间超过 240 秒,它会开始将 InnoDB 监控输出打印到错误日志。如果锁请求超过信号量等待阈值,InnoDB 会中止该进程。为了完全避免信号量等待超时,请运行 CHECK TABLE QUICK,而不是 CHECK TABLE

  • CHECK TABLEInnoDB SPATIAL 索引的功能包括 R 树有效性检查和确保 R 树行数与聚簇索引匹配的检查。

  • CHECK TABLE 支持 InnoDB 支持的虚拟生成列上的辅助索引。

  • InnoDB 支持并行聚簇索引读取,这可以提高 CHECK TABLE 性能。 InnoDBCHECK TABLE 操作期间读取两次聚簇索引。第二次读取可以并行执行。必须将 innodb_parallel_read_threads 会话变量设置为大于 1 的值,才能执行并行聚簇索引读取。用于执行并行聚簇索引读取的实际线程数取决于 innodb_parallel_read_threads 设置或要扫描的索引子树数,以较小者为准。

MyISAM 表的 CHECK TABLE 使用说明

以下说明适用于 MyISAM

  • CHECK TABLE 会更新 MyISAM 表的关键统计信息。

  • 如果 CHECK TABLE 输出未返回 OKTable is already up to date,您通常应该对该表进行修复。请参阅 第 9.6 节,“MyISAM 表维护和崩溃恢复”

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