13.7.2.2 CHECK TABLE 语句
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE检查一个或多个 table 中是否有错误。对于MyISAM
table,键统计信息也会更新。 CHECK TABLE还可以检查视图是否存在问题,例如视图定义中引用的 table 不再存在。
要检查 table,您必须具有一些特权。
CHECK TABLE适用于InnoDB,MyISAM,ARCHIVE和CSVtable。
在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 | status ,error ,info ,note 或warning |
Msg_text | 信息性消息 |
该语句可能为每个检查的 table 产生许多行信息。最后一行的Msg_type
值为status
,而Msg_text
通常应为OK
。对于MyISAM
table,如果没有OK
或Table is already up to date
,则通常应修复该 table。参见第 7.6 节“ MyISAMtable 维护和崩溃恢复”。 Table is already up to date
table 示 table 的存储引擎指示不需要检查 table。
检查版本兼容性
FOR UPGRADE
选项检查命名 table 是否与当前版本的 MySQL 兼容。使用FOR UPGRADE
,服务器将检查每个 table,以确定自创建 table 以来,table 的任何数据类型或索引中是否存在任何不兼容的更改。如果不是,则检查成功。否则,如果存在不兼容的情况,服务器将对 table 进行全面检查(这可能需要一些时间)。如果完全检查成功,服务器将使用当前的 MySQL 版本号标记 table 的.frm
文件。标记.frm
文件可确保对具有相同服务器版本的 table 进行进一步检查将很快。
由于数据类型的存储格式已更改或其排序 Sequences 已更改,因此可能会出现不兼容性。我们的目的是避免这些更改,但是有时它们对于纠正比发行版之间的不兼容性更严重的问题是必要的。
FOR UPGRADE
发现以下不兼容之处:
-
在 MySQL 4.1 和 5.0 之间,
InnoDB
和MyISAM
table 的TEXT列中的结尾空间的索引 Sequences 已更改。 -
在 MySQL 5.0.3 和 5.0.5 之间更改了新的DECIMAL数据类型的存储方法。
-
如果您的 table 是由与当前正在运行的 MySQL 服务器不同的 MySQL 服务器版本创建的,则
FOR UPGRADE
table 示该 table 的.frm
文件的版本不兼容。在这种情况下,由CHECK TABLE返回的结果集包含Msg_type
值为error
和Msg_text
值为``+84+`的行。 -
有时会对需要重建 table 索引的字符集或排序规则进行更改。有关此类更改的详细信息,请参见第 2.11.3 节“ MySQL 5.7 中的更改”。有关重建 table 的信息,请参见第 2.11.12 节,“重建或修复 table 或索引”。
-
弃用了YEAR(2)数据类型,并在 MySQL 5.7.5 中删除了对它的支持。对于包含YEAR(2)列的 table,CHECK TABLE建议使用REPAIR TABLE,它将 2 位YEAR(2)列转换为 4 位YEAR列。
-
从 MySQL 5.7.2 开始,触发器创建时间得以保留。如果针对具有触发器的 table 运行,则检查 table...升级将针对在 MySQL 5.7.2 之前创建的每个触发器显示此警告:
Trigger db_name.tbl_name.trigger_name does not have CREATED attribute.
该警告仅供参考。触发器没有任何变化。
- 从 MySQL 5.7.7 开始,如果一个 table 包含旧的 5.6.4 格式的旧时态列(TIME,DATETIME和TIMESTAMP列不支持小数秒精度),并且该 table 被禁用,则报告该 table 需要重建。 。这有助于 MySQL 升级过程检测和升级包含旧时态列的 table。如果启用avoid_temporal_upgrade,则
FOR UPGRADE
忽略 table 中存在的旧时态列;因此,升级过程不会升级它们。
要检查包含此类临时列且需要重建的 table,请在执行检查 table...升级之前禁用avoid_temporal_upgrade。
- 对于使用 nonlocal 分区的 table 会发出警告,因为 nonlocal 分区在 MySQL 5.7 中已弃用,而在 MySQL 8.0 中已删除。参见第 22 章,分区。
检查数据一致性
下 table 显示了可以提供的其他检查选项。这些选项将传递到存储引擎,该引擎可以使用或忽略它们。
Type | Meaning |
---|---|
QUICK | 不要扫描行以检查链接是否不正确。适用于InnoDB 和MyISAM table 和视图。 |
FAST | 仅检查尚未正确关闭的 table。忽略InnoDB ;仅适用于MyISAM 个 table 和视图。 |
CHANGED | 仅检查自上次检查以来已更改的 table 或未正确关闭的 table。忽略InnoDB ;仅适用于MyISAM 个 table 和视图。 |
MEDIUM | 扫描行以确认删除的链接有效。这还将计算行的密钥校验和,并使用计算出的密钥校验和进行校验。忽略InnoDB ;仅适用于MyISAM 个 table 和视图。 |
EXTENDED | 对每一行的所有键进行全键查找。这样可以确保 table 是 100%一致的,但是要花费很长时间。忽略InnoDB ;仅适用于MyISAM 个 table 和视图。 |
如果未指定选项QUICK
,MEDIUM
或EXTENDED
,则动态格式MyISAM
table 的默认检查类型为MEDIUM
。这与在 table 上运行myisamchk --medium-check tbl_name的结果相同。对于静态格式的MyISAM
table,默认的检查类型也是MEDIUM
,除非指定了CHANGED
或FAST
。在这种情况下,默认值为QUICK
。 CHANGED
和FAST
的行扫描被跳过,因为行很少被破坏。
您可以组合检查选项,如以下示例中所示,该示例对 table 进行快速检查以确定是否正确关闭了 table:
CHECK TABLE test_table FAST QUICK;
Note
如果CHECK TABLE发现标记为“损坏”或“未正确关闭”的 table 没有问题,则CHECK TABLE可能会删除该标记。
如果 table 已损坏,则问题很可能出在索引而不是数据部分。前面所有检查类型均会彻底检查索引,因此应发现大多数错误。
要检查您认为可以的 table,请使用无检查选项或QUICK
选项。急忙时应使用后者,这样冒着很小的风险,即QUICK
在数据文件中找不到错误。 (在大多数情况下,在正常使用下,MySQL 应该在数据文件中发现任何错误.如果发生这种情况,该 table 将标记为“已损坏”,并且只有在修复后才能使用.)
FAST
和CHANGED
主要用于从脚本中使用(例如,从 cron 执行)以定期检查 table。在大多数情况下,FAST
比CHANGED
更可取。 (唯一不受欢迎的情况是怀疑您在MyISAM
代码中发现了错误.)
EXTENDED
仅在运行常规检查后使用,但是当 MySQL 尝试更新行或通过键查找行时,仍然会从 table 中获取错误。如果正常检查成功,这是极不可能的。
检查 table...扩展的使用可能会影响查询优化器生成的执行计划。
CHECK TABLE报告的某些问题无法自动纠正:
Found row where the auto_increment column has the value 0
.
这意味着您在 table 中有一行,其中AUTO_INCREMENT
索引列包含值 0.(可以通过使用UPDATE语句将列显式设置为 0,来创建AUTO_INCREMENT
列为 0 的行。)
这本身不是错误,但是如果您决定转储 table 并还原它或对 table 执行ALTER TABLE,则可能会引起麻烦。在这种情况下,AUTO_INCREMENT
列会根据AUTO_INCREMENT
列的规则更改值,这可能会导致诸如重复键错误之类的问题。
要消除警告,请执行UPDATE语句以将列设置为 0 以外的其他值。
InnoDBtable 的检查 table 使用说明
以下说明适用于InnoDB个 table:
-
如果CHECK TABLE遇到损坏的页面,则服务器退出以防止错误传播(错误#10132)。如果损坏发生在辅助索引中,但 table 数据可读,则运行CHECK TABLE仍会导致服务器退出。
-
如果CHECK TABLE在聚集索引中遇到损坏的
DB_TRX_ID
或DB_ROLL_PTR
字段,则CHECK TABLE可以导致InnoDB
访问无效的撤消日志记录,从而导致MVCC相关的服务器退出。 -
如果CHECK TABLE在
InnoDB
table 或索引中遇到错误,它将报告错误,通常会标记索引,有时还会将 table 标记为已损坏,从而阻止进一步使用索引或 table。此类错误包括辅助索引中的条目数不正确或链接不正确。 -
如果CHECK TABLE在辅助索引中找到错误数目的条目,则它报告错误,但不会导致服务器退出或阻止对该文件的访问。
-
CHECK TABLE调查索引页结构,然后调查每个键条目。它不会验证指向群集记录的键指针,也不会遵循BLOB指针的路径。
-
当
InnoDB
table 存储在其自己的.ibd file中时,.ibd
文件的前 3 pages包含标题信息,而不是 table 或索引数据。 CHECK TABLE语句不检测仅影响标题数据的不一致之处。要验证InnoDB
.ibd
文件的全部内容,请使用innochecksum命令。 -
在大型
InnoDB
table 上运行CHECK TABLE时,在CHECK TABLE执行期间可能会阻止其他线程。为避免超时,对于CHECK TABLE操作,signal 灯 await 阈值(600 秒)被延长了 2 小时(7200 秒)。如果InnoDB
检测到 240 秒或更长时间的 signal 量 await,它将开始将InnoDB
监视器输出打印到错误日志。如果锁定请求超出 signal 灯 await 阈值,则InnoDB
中止该过程。为避免 signal 灯 await 超时的全部可能性,请运行检查 table 快速而不是CHECK TABLE。 -
InnoDB
SPATIAL
索引的CHECK TABLE功能包括 R 树有效性检查以及确保 R 树行计数与聚 Cluster 索引匹配的检查。 -
CHECK TABLE支持由
InnoDB
支持的虚拟生成列上的二级索引。
MyISAMtable 的检查 table 使用说明
以下说明适用于MyISAM个 table:
-
CHECK TABLE更新
MyISAM
table 的键统计信息。 -
如果CHECK TABLE输出未返回
OK
或Table is already up to date
,则通常应修复该 table。参见第 7.6 节“ MyISAMtable 维护和崩溃恢复”。 -
如果未指定CHECK TABLE选项
QUICK
,MEDIUM
或EXTENDED
,则动态格式MyISAM
table 的默认检查类型为MEDIUM
。这与在 table 上运行myisamchk --medium-check tbl_name的结果相同。对于静态格式的MyISAM
table,默认的检查类型也是MEDIUM
,除非指定了CHANGED
或FAST
。在这种情况下,默认值为QUICK
。CHANGED
和FAST
的行扫描被跳过,因为行很少被破坏。