CHECK TABLE 仅检测不修复,MyISAM 支持完整校验与 REPAIR TABLE 修复,InnoDB 仅轻量检查页校验和,需依赖崩溃恢复或重建;必须有 SELECT 权限,关键看 Msg_type 是否为 error 或 warning。

CHECK TABLE 能检测 MyISAM 表的物理结构和索引一致性,但对 InnoDB 仅做轻量检查(如页校验),不能替代 mysqlcheck --repair 或崩溃恢复流程。
执行 CHECK TABLE 的基本语法和权限要求
必须拥有 SELECT 权限,且表类型为 MyISAM 才能触发完整校验逻辑。InnoDB 表即使执行成功,输出中的 Msg_type 多为 Status,而非 Error 或 Warning。
常用形式:
CHECK TABLE `mydb`.`mytable`;
支持批量检查:
CHECK TABLE t1, t2, t3;
可加扩展选项控制行为:
-
QUICK:只检查索引文件头和唯一键是否重复(最快,但漏掉数据块损坏) -
MEDIUM(默认):读取所有索引键并验证指向的数据行是否存在 -
EXTENDED:逐行读取数据文件,校验每条记录结构(最慢,MyISAM 下才真正有效)
看懂 CHECK TABLE 的返回结果
结果集包含四列:Table、Op、Msg_type、Msg_text。关键不是“是否报错”,而是 Msg_type 值是否为 Error 或 Warning。
典型异常输出:
+------------------+--------+-----------+-----------------------------------------+ | Table | Op | Msg_type | Msg_text | +------------------+--------+-----------+-----------------------------------------+ | mydb.mytable | check | Error | Incorrect key file for table | | mydb.mytable | check | Warning | 1 client is using or hasn't closed table| +------------------+--------+-----------+-----------------------------------------+
注意:status 类型不表示问题,只是运行状态说明;info 通常含扫描行数等统计信息。
如果看到 Incorrect key file 或 Record-file is crashed,说明 .MYI 或 .MYD 文件已损坏,需立即停写并考虑修复。
CHECK TABLE 不等于自动修复,且有并发风险
它纯属只读检测,不会修改任何文件。想修复,得用 REPAIR TABLE(MyISAM)或重建表(InnoDB)。但要注意:
- 执行期间表会被加
READ LOCAL锁,允许并发INSERT(MyISAM 特性),但会阻塞UPDATE/DELETE - 若在主从复制环境中检查大表,可能拉长从库 SQL 线程延迟,尤其
EXTENDED模式下 I/O 密集 - 不要在业务高峰期对 >1GB 的 MyISAM 表跑
EXTENDED,容易触发Waiting for table flush
MyISAM 的校验逻辑依赖文件系统层面的完整性,一旦磁盘静默错误或突然断电,.MYI 和 .MYD 可能各自损坏但 CHECK TABLE 仍返回正常——这种静默失败没法靠它发现。


















