CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE
检查一个或多个表是否有错误。CHECK TABLE
还可以检查视图是否存在问题,例如视图定义中引用的表不再存在。
要检查一个表,您必须对它有一些特权。
CHECK TABLE
适用于
InnoDB
、
MyISAM
、
ARCHIVE
和
CSV
表格。
CHECK TABLE
在
表
上运行之前InnoDB
,请参阅
InnoDB 表的 CHECK TABLE 使用说明。
CHECK TABLE
支持分区表,可以ALTER TABLE ...
CHECK PARTITION
用来检查一个或多个分区;有关详细信息,请参阅第 13.1.9 节,“ALTER TABLE 语句”和
第 24.3.4 节,“分区维护”。
CHECK TABLE
忽略未索引的虚拟生成列。
CHECK TABLE
返回一个结果集,其列如下表所示。
柱子 | 价值 |
---|---|
Table |
表名 |
Op |
总是check |
Msg_type |
status , error ,
info ,note 或
warning |
Msg_text |
信息性消息 |
该语句可能会为每个已检查的表生成多行信息。最后一行的Msg_type
值为 ,status
通常
Msg_text
应为
OK
。Table is already up to
date
表示表的存储引擎表明不需要检查表。
该FOR UPGRADE
选项检查命名表是否与当前版本的 MySQL 兼容。使用FOR UPGRADE
,服务器检查每个表以确定自创建表以来表的任何数据类型或索引是否有任何不兼容的更改。如果不是,则检查成功。否则,如果可能存在不兼容性,服务器将对表运行全面检查(这可能需要一些时间)。
由于数据类型的存储格式已更改或其排序顺序已更改,可能会发生不兼容。我们的目标是避免这些更改,但有时它们是纠正比版本之间不兼容更糟糕的问题所必需的。
FOR UPGRADE
发现这些不兼容性:
在 MySQL 4.1 和 5.0 之间 ,表的
TEXT
列InnoDB
和表 的结束空间的索引顺序 发生了变化。MyISAM
新
DECIMAL
数据类型的存储方式在 MySQL 5.0.3 和 5.0.5 之间发生了变化。有时会更改需要重建表索引的字符集或排序规则。有关此类更改的详细信息,请参阅 第 2.11.4 节,“MySQL 8.0 中的更改”。有关重建表的信息,请参阅 第 2.11.13 节,“重建或修复表或索引”。
MySQL 8.0 不支持
YEAR(2)
旧版本 MySQL 中允许的 2 位数据类型。对于包含YEAR(2)
列的表,CHECK TABLE
建议REPAIR TABLE
将 2 位列转换YEAR(2)
为 4YEAR
位列。触发器创建时间保持不变。
如果一个表包含 5.6.4 之前格式的旧时间列( 、 和不支持小数秒精度的列)并且系统变量被禁用,则该表被报告
TIME
为DATETIME
需要TIMESTAMP
重建avoid_temporal_upgrade
。这有助于 MySQL 升级过程检测和升级包含旧时间列的表。如果avoid_temporal_upgrade
启用,则FOR UPGRADE
忽略表中存在的旧时间列;因此,升级过程不会升级它们。要检查包含此类临时列并需要重建的表,请
avoid_temporal_upgrade
在执行前 禁用CHECK TABLE ... FOR UPGRADE
。对使用非本机分区的表发出警告,因为在 MySQL 8.0 中删除了非本机分区。请参阅 第 24 章,分区。
下表显示了可以提供的其他检查选项。这些选项被传递给存储引擎,存储引擎可能会使用或忽略它们。
类型 | 意义 |
---|---|
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。(可以 通过使用语句AUTO_INCREMENT
将列显式设置为 0 来创建列为 0 的行。)UPDATE
这本身不是错误,但如果您决定转储表并恢复它或
ALTER TABLE
对表执行操作,则可能会造成麻烦。在这种情况下,AUTO_INCREMENT
列会根据AUTO_INCREMENT
列的规则更改值,这可能会导致重复键错误等问题。要消除警告,请执行
UPDATE
语句将列设置为 0 以外的某个值。
以下注释适用于
InnoDB
表格:
如果
CHECK TABLE
遇到损坏的页面,服务器将退出以防止错误传播(错误 #10132)。如果损坏发生在二级索引但表数据可读,运行CHECK TABLE
仍然会导致服务器退出。如果在聚集索引中
CHECK TABLE
遇到损坏的DB_TRX_ID
或 字段,可能会导致 访问无效的撤消日志记录,从而导致与 MVCC相关的服务器退出。DB_ROLL_PTR
CHECK TABLE
InnoDB
如果
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
.CHECK TABLE
索引的功能InnoDB
SPATIAL
包括 R-tree 有效性检查和检查以确保 R-tree 行计数与聚集索引匹配。CHECK TABLE
支持虚拟生成列的二级索引,这是InnoDB
.从 MySQL 8.0.14 开始,
InnoDB
支持并行聚集索引读取,可以提高CHECK TABLE
性能。InnoDB
在操作期间读取聚集索引两次CHECK TABLE
。第二次读取可以并行执行。innodb_parallel_read_threads
会话变量必须设置为大于 1 的值才能进行并行聚集索引读取。 默认值为 4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads
设置或要扫描的索引子树数决定,以较小者为准。
以下注释适用于
MyISAM
表格:
CHECK TABLE
更新MyISAM
表的关键统计信息。如果
CHECK TABLE
输出未返回OK
或Table is already up to date
,您通常应该运行表修复。参见 第 7.6 节,“MyISAM 表维护和崩溃恢复”。如果未指定任何
CHECK TABLE
选项QUICK
、MEDIUM
或EXTENDED
,则动态格式MyISAM
表 的默认检查类型为MEDIUM
。这与在表上运行myisamchk --medium-checktbl_name
的结果相同。默认检查类型也MEDIUM
适用于静态格式MyISAM
表,除非 指定CHANGED
或FAST
指定。在这种情况下,默认值为QUICK
. 跳过行扫描CHANGED
,FAST
因为行很少损坏。