CHECK TABLE语句
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支持分区表,您可以ALTER TABLE ... CHECK PARTITION用来检查一个或多个分区;有关更多信息,请参见“ ALTER TABLE语句”和“分区的维护”。
CHECK TABLE忽略未索引的虚拟生成的列。
- 检查表输出
- 检查版本兼容性
- 检查数据一致性
- 检查表InnoDB表的使用说明
- 检查表MyISAM表的使用说明
检查表输出
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之间进行了更改。 - 有时会对需要重建表索引的字符集或排序规则进行更改。有关此类更改的详细信息,请参见“ MySQL 8.0中的更改”。有关重建表的信息,
- MySQL 8.0不支持
YEAR(2)旧版本MySQL中允许的两位数数据类型。对于包含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中已删除非本地分区。请参阅分区。
检查数据一致性
下表显示了可以提供的其他检查选项。这些选项将传递到存储引擎,该引擎可以使用或忽略它们。
| 类型 | 含义 |
|---|---|
QUICK | 不要扫描行以检查链接是否不正确。适用于InnoDB并MyISAM表和视图。 |
FAST | 仅检查尚未正确关闭的表。被忽略InnoDB;仅适用于MyISAM表和视图。 |
CHANGED | 仅检查自上次检查以来已更改的表或未正确关闭的表。被忽略InnoDB;仅适用于MyISAM表和视图。 |
MEDIUM | 扫描行以确认删除的链接有效。这还将计算行的密钥校验和,并使用计算出的密钥校验和进行校验。被忽略InnoDB;仅适用于MyISAM表和视图。 |
EXTENDED | 对每一行的所有键进行全键查找。这样可以确保表是100%一致的,但是要花费很长时间。被忽略InnoDB;仅适用于MyISAM表和视图。 |
您可以组合检查选项,如以下示例中所示,该示例对表进行快速检查以确定是否正确关闭了表:
CHECK TABLE test_tableFAST 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通过使用UPDATE语句将列显式设置为0 来创建列为0 的行。)这本身不是错误,但是如果您决定转储表并还原它或
ALTER TABLE在表上执行操作,可能会引起麻烦。在这种情况下,该AUTO_INCREMENT列会根据AUTO_INCREMENT列规则更改值,这可能会导致诸如重复键错误之类的问题。要消除该警告,请执行一条
UPDATE语句以将该列设置为除0以外的某个值。
检查表InnoDB表的使用说明
以下说明适用于InnoDB表:
- 如果
CHECK TABLE遇到损坏的页面,服务器将退出以防止错误传播(错误#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 页所述的.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 TABLEInnoDBSPATIAL索引的功能包括R树有效性检查以及确保R树行计数与聚簇索引匹配的检查。CHECK TABLE支持虚拟生成的列上的二级索引,这些列受所支持InnoDB。- 从MySQL 8.0.14开始,
InnoDB支持并行聚集索引读取,这可以提高CHECK TABLE性能。InnoDB在CHECK TABLE操作期间两次读取聚簇索引。可以并行执行第二次读取。的innodb_parallel_read_threads并行聚簇索引读取发生会话变量必须被设置为一个大于1的值。默认值为4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树的数量确定,以较小者为准。
检查表MyISAM表的使用说明
以下说明适用于MyISAM表:
CHECK TABLE更新MyISAM表的关键统计信息。- 如果
CHECK TABLE输出未返回OK或Table is already up to date,则通常应修复该表。请参见“ MyISAM表维护和崩溃恢复”。 - 如果未指定
CHECK TABLE选项QUICK,MEDIUM或EXTENDED,则动态格式MyISAM表的默认检查类型为MEDIUM。这与在表上运行myisamchk --medium-check的tbl_name结果相同。除非指定或,否则默认检查类型也适用MEDIUM于静态格式的MyISAM表。在这种情况下,默认值为。由于行很少被破坏,因此跳过行扫描。CHANGEDFASTQUICKCHANGEDFAST
