Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

15.7.3.2 检查表语句

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

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

检查表 检查一个或多个表以查找错误。 检查表 也可以检查视图中的问题,例如在视图定义中引用的表不存在。

要检查一个表,您必须对其拥有某些权限。

检查表 适用于 InnoDBMyISAMARCHIVECSV 表。

InnoDB 表上运行 检查表 之前,请参阅 CHECK TABLE 用法说明 for InnoDB 表

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

检查表 忽略未索引的虚拟生成列。

CHECK TABLE 输出

CHECK TABLE 返回一个结果集,具有以下表中的列。

Column Value
表名 表名
Op 总是 check
Msg_type 状态、错误、信息、注意 或 警告
Msg_text 信息性消息

该语句可能会为每个检查的表生成许多行信息。最后一行具有 Msg_type 值为 状态Msg_text 通常应为 OK表已经是最新的 表示存储引擎认为不需要检查表。

检查版本兼容性

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

不兼容性可能是由于数据类型的存储格式更改或其排序顺序更改所致。我们的目标是避免这些更改,但有时它们是必要的,以纠正问题,这些问题比版本之间的不兼容性更糟。

FOR UPGRADE 发现这些不兼容性:

检查数据一致性

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

Type Meaning
QUICK 不扫描行以检查不正确的链接。适用于 InnoDB 和 MyISAM 表和视图。
FAST 仅检查未正确关闭的表。忽略 InnoDB;仅适用于 MyISAM 表和视图。
CHANGED 仅检查自上次检查以来已更改的表或未正确关闭的表。忽略 InnoDB;仅适用于 MyISAM 表和视图。
MEDIUM 扫描行以验证已删除的链接是否有效。此外,还计算行的键校验和和键的计算校验和进行验证。忽略 InnoDB;仅适用于 MyISAM 表和视图。
EXTENDED 对每行的所有键执行完整的键查找。这确保表是 100% 一致的,但需要很长时间。忽略 InnoDB;仅适用于 MyISAM 表和视图。

您可以组合检查选项,如下面的示例,它对表执行快速检查以确定是否正确关闭:

CHECK TABLE test_table FAST QUICK;
Note

如果 CHECK TABLE 未找到表的问题,而该表被标记为 损坏的未正确关闭CHECK TABLE 可能会删除该标记。

如果表损坏,问题很可能在索引中,而不是数据部分。所有前面的检查类型都将彻底检查索引,因此应该找到大多数错误。

要检查您认为正确的表,请使用无检查选项或 QUICK 选项。后者应该在您赶时间且愿意承担非常小的风险时使用 QUICK 不会找到数据文件中的错误。(在大多数情况下,在正常使用中,MySQL 应该找到数据文件中的任何错误。如果发生这种情况,表将被标记为 损坏的 并且无法使用,直到它被修复。)

FASTCHANGED 主要是从脚本中使用(例如,从 cron 执行),以周期性地检查表。在大多数情况下,FASTCHANGED 更加优先。(唯一的情况是,当您怀疑在 MyISAM 代码中发现了错误时。)

EXTENDED 只应在运行正常检查后仍然从表中获取错误时使用,例如,当 MySQL 尝试更新行或按键查找行时。

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

CHECK TABLE 报告的一些问题无法自动修复:

  • Found row where the auto_increment column has the value 0

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

    这本身不是错误,但可能会在将表转储并恢复或对表执行 ALTER TABLE 时引发问题,例如重复键错误。

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

CHECK TABLE 用法注意事项 for InnoDB 表

以下注意事项适用于 InnoDB 表:

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

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

  • 如果 CHECK TABLE 遇到 InnoDB 表或索引中的错误,它将报告错误,并通常将索引和有时将表标记为损坏,从而防止进一步使用索引或表。这些错误包括二级索引中的条目数不正确或链接不正确。

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

  • CHECK TABLE 会调查索引页结构,然后调查每个键条目。它不会验证聚簇记录的键指针或跟踪 BLOB 指针的路径。

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

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

  • CHECK 表 对于 InnoDB SPATIAL 索引包括 R 树有效性检查和检查 R 树行计数是否与聚集索引匹配。

  • CHECK 表 支持虚拟生成列的次要索引,这些索引由 InnoDB 支持。

  • InnoDB 支持并行聚集索引读取,这可以提高 CHECK 表 性能。InnoDBCHECK 表 操作期间两次读取聚集索引。第二次读取可以并行进行。innodb_parallel_read_threads 会话变量必须设置为大于 1 的值,以便并行聚集索引读取发生。默认值为 4。实际使用的线程数由 innodb_parallel_read_threads 设置或要扫描的索引子树的数量中较小的那个确定。

CHECK 表使用注意事项 MyISAM 表

以下注意事项适用于MyISAM表:

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

  • 如果 CHECK TABLE 输出不返回 OK表已经是最新的,您通常应该运行表的修复。请参阅 第 9.6 节,“MyISAM 表维护和崩溃恢复”

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