Documentation Home

13.7.2.2 CHECK TABLE 语句

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

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

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

要检查一个表,您必须对它有一些特权。

CHECK TABLE适用于 InnoDBMyISAMARCHIVECSV表格。

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

CHECK TABLE支持分区表,可以ALTER TABLE ... CHECK PARTITION用来检查一个或多个分区;有关详细信息,请参阅第 13.1.7 节,“ALTER TABLE 语句”第 19.3.4 节,“分区的维护”

仅在 MySQL 5.6.11 中,gtid_next 必须AUTOMATIC在发出此语句之前设置为。(错误#16062608、错误#16715809、错误#69045)

检查表输出

CHECK TABLE返回一个结果集,其列如下表所示。

柱子 价值
Table 表名
Op 总是check
Msg_type status, error, info,notewarning
Msg_text 信息性消息

该语句可能会为每个已检查的表生成多行信息。最后一行的Msg_type 值为 ,status通常 Msg_text应为 OK。对于MyISAM表,如果您没有得到OKTable is already up to date,通常应该对表进行修复。参见第 7.6 节,“MyISAM 表维护和崩溃恢复”Table is already up to date表示表的存储引擎表明不需要检查表。

检查版本兼容性

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

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

FOR UPGRADE发现这些不兼容性:

  • 在 MySQL 4.1 和 5.0 之间 ,表的TEXTInnoDB和表 的结束空间的索引顺序 发生了变化。MyISAM

  • DECIMAL数据类型的存储方式在 MySQL 5.0.3 和 5.0.5 之间发生了变化。

  • 如果您的表是由与您当前运行的不同版本的 MySQL 服务器创建的, FOR UPGRADE则表示该表包含.frm版本不兼容的文件。在这种情况下,返回的结果集 CHECK TABLE包含一个Msg_type值为 error和一个Msg_text 值为Table upgrade required. Please do "REPAIR TABLE `tbl_name`" to fix it!

  • 有时会更改需要重建表索引的字符集或排序规则。有关此类更改的详细信息,请参阅 第 2.11.3 节,“MySQL 5.6 中的更改”。有关重建表的信息,请参阅 第 2.11.10 节,“重建或修复表或索引”

  • 从 MySQL 5.6.6 开始不推荐使用该YEAR(2)数据类型。对于包含 YEAR(2)列的表, CHECK TABLE建议 REPAIR TABLE将 2 位列转换YEAR(2) 为 4YEAR 位列。

  • 从 MySQL 5.6.4 开始,MySQL 允许 TIMEDATETIMETIMESTAMP列值的小数秒。因此,这些时间列类型的编码和存储要求在 MySQL 5.6.4 及更高版本中创建的表中有所不同。此不兼容的更改在 第 2.11.3 节,“MySQL 5.6 中的更改”中进行了描述。升级到 MySQL 5.6.4 或更高版本时,请注意 CHECK TABLE ... FOR UPGRADE不会报告使用 MySQL 5.6.4 之前的格式的临时列(Bug #73008,Bug #18985579)。在 MySQL 5.6.24 中,两个新的系统变量, avoid_temporal_upgrade以及 show_old_temporals, 被添加以提供对时间列升级的控制(Bug #72997,Bug #18985760)。

检查数据一致性

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

类型 意义
QUICK 不要扫描行来检查不正确的链接。适用于 表InnoDBMyISAM 视图。
FAST 仅检查未正确关闭的表。仅适用于 MyISAM表和视图;被忽略了 InnoDB
CHANGED 仅检查自上次检查以来已更改或未正确关闭的表。仅适用于 MyISAM表和视图;被忽略了 InnoDB
MEDIUM 扫描行以验证删除的链接是否有效。这还会计算行的密钥校验和,并使用计算出的密钥校验和来验证这一点。仅适用于 MyISAM表和视图;被忽略了 InnoDB
EXTENDED 对每一行的所有键进行完整的键查找。这样可以确保表是 100% 一致的,但是需要很长时间。仅适用于MyISAM表和视图;被忽略了InnoDB

如果未指定任何选项QUICKMEDIUMEXTENDED,则动态格式 MyISAM表的默认检查类型为MEDIUM这与在表上运行myisamchk --medium-checktbl_name的结果相同 。默认检查类型也 MEDIUM适用于静态格式 MyISAM表,除非 指定CHANGEDFAST指定。在这种情况下,默认值为 QUICK. 跳过行扫描 CHANGEDFAST因为行很少损坏。

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

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 以外的某个值。

InnoDB 表的 CHECK TABLE 使用注意事项

以下注释适用于 InnoDB表格:

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

  • 如果在聚集索引中 CHECK TABLE遇到损坏的DB_TRX_ID或 字段,可能会导致 访问无效的撤消日志记录,从而导致与 MVCC相关的服务器退出。 DB_ROLL_PTRCHECK TABLEInnoDB

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

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

  • CHECK TABLE检查索引页面结构,然后检查每个关键条目。它不验证指向集群记录的键指针或遵循BLOB 指针的路径。

  • 当一个InnoDB表存储在它自己的 .ibd 文件中时, 文件的前 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.