CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
检查表
检查一个或多个表以查找错误。 检查表
也可以检查视图中的问题,例如在视图定义中引用的表不存在。
要检查一个表,您必须对其拥有某些权限。
检查表
适用于 InnoDB
、 MyISAM
、 ARCHIVE
和 CSV
表。
在 InnoDB
表上运行 检查表
之前,请参阅 CHECK TABLE 用法说明 for InnoDB 表。
检查表
支持分区表,您可以使用 ALTER TABLE ... CHECK PARTITION
来检查一个或多个分区;有关更多信息,请参阅 第 15.1.9 节,“ALTER TABLE 语句” 和 第 26.3.4 节,“分区维护”。
检查表
忽略未索引的虚拟生成列。
CHECK TABLE
返回一个结果集,具有以下表中的列。
Column | Value |
---|---|
表名 | 表名 |
Op | 总是 check |
Msg_type | 状态、错误、信息、注意 或 警告 |
Msg_text | 信息性消息 |
该语句可能会为每个检查的表生成许多行信息。最后一行具有 Msg_type
值为 状态
,Msg_text
通常应为 OK
。表已经是最新的
表示存储引擎认为不需要检查表。
使用 FOR UPGRADE
选项可以检查指定表是否与当前 MySQL 版本兼容。使用 FOR UPGRADE
,服务器将检查每个表,以确定自表创建以来是否有任何不兼容的更改在表的数据类型或索引中。如果没有,不兼容的检查将成功。否则,如果存在可能的不兼容性,服务器将对表进行完整的检查(这可能需要一些时间)。
不兼容性可能是由于数据类型的存储格式更改或其排序顺序更改所致。我们的目标是避免这些更改,但有时它们是必要的,以纠正问题,这些问题比版本之间的不兼容性更糟。
FOR UPGRADE
发现这些不兼容性:
-
在
TEXT
列中的结尾空格索引顺序在InnoDB
和MyISAM
表之间在 MySQL 4.1 和 5.0 之间更改。 -
新的
DECIMAL
数据类型的存储方法在 MySQL 5.0.3 和 5.0.5 之间更改。 -
有时,字符集或排序规则的更改需要重建表索引。有关这些更改的详细信息,请参阅第 3.5 节,“MySQL 8.3 中的更改”。有关重建表的信息,请参阅第 3.14 节,“重建或修复表或索引”。
-
MySQL 8.3 不支持旧版本 MySQL 中允许的 2 位
YEAR(2)
数据类型。对于包含YEAR(2)
列的表,CHECK TABLE
建议REPAIR TABLE
,将 2 位YEAR(2)
列转换为 4 位YEAR
列。 -
触发器创建时间保持不变。
-
如果表包含旧的时间列(
TIME
、DATETIME
和TIMESTAMP
列)且不支持小数秒精度,并且avoid_temporal_upgrade
系统变量被禁用,那么该表将被报告为需要重建。这有助于 MySQL 升级过程检测和升级包含旧时间列的表。如果avoid_temporal_upgrade
启用,FOR UPGRADE
将忽略表中的旧时间列,因此升级过程不会升级它们。要检查包含旧时间列的表并需要重建,请在执行
CHECK TABLE ... FOR UPGRADE
之前禁用avoid_temporal_upgrade
。 -
对于使用非本机分区的表,将发出警告,因为非本机分区在 MySQL 8.3 中被删除。请参阅第 26 章《分区》。
以下表格显示了可以给定的其他检查选项。这些选项将传递给存储引擎,它可能使用或忽略它们。
Type | Meaning |
---|---|
QUICK | 不扫描行以检查不正确的链接。适用于 InnoDB 和 MyISAM 表和视图。 |
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 应该找到数据文件中的任何错误。如果发生这种情况,表将被标记为 “损坏的” 并且无法使用,直到它被修复。)
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。(可以使用UPDATE
语句显式将列设置为 0 来创建该行。)这本身不是错误,但可能会在将表转储并恢复或对表执行
ALTER TABLE
时引发问题,例如重复键错误。要消除警告,请执行
UPDATE
语句以将列设置为其他值,而不是 0。
以下注意事项适用于 InnoDB
表:
-
如果
CHECK TABLE
遇到损坏的页面,服务器将退出以防止错误传播(Bug #10132)。如果损坏发生在次要索引中,但表数据仍可读取,运行CHECK TABLE
仍可能导致服务器退出。 -
如果
CHECK TABLE
遇到聚簇索引中的损坏的DB_TRX_ID
或DB_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 表
性能。InnoDB
在CHECK 表
操作期间两次读取聚集索引。第二次读取可以并行进行。innodb_parallel_read_threads
会话变量必须设置为大于 1 的值,以便并行聚集索引读取发生。默认值为 4。实际使用的线程数由innodb_parallel_read_threads
设置或要扫描的索引子树的数量中较小的那个确定。
以下注意事项适用于MyISAM
表:
-
CHECK TABLE
更新MyISAM
表的键统计信息。 -
如果
CHECK TABLE
输出不返回OK
或表已经是最新的
,您通常应该运行表的修复。请参阅 第 9.6 节,“MyISAM 表维护和崩溃恢复”。 -
如果没有指定
CHECK TABLE
选项QUICK
、MEDIUM
或EXTENDED
,则动态格式MyISAM
表的默认检查类型为MEDIUM
。这与在表上运行 myisamchk --medium-checktbl_name
相同。静态格式MyISAM
表的默认检查类型也是MEDIUM
,除非指定CHANGED
或FAST
。在那种情况下,默认值是QUICK
。对于CHANGED
和FAST
,行扫描被跳过,因为行很少被损坏。