#### 13.7.3.2 CHECK TABLE 语句

[](<>)

```
CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option: {
    FOR UPGRADE
  | QUICK
  | FAST
  | MEDIUM
  | EXTENDED
  | CHANGED
}
```

[`检查表`](check-table.html)检查一个或多个表是否有错误。[`检查表`](check-table.html)还可以检查视图是否存在问题，例如视图定义中引用的表不再存在。

要检查一个表，你必须对它有一些特权。

[`检查表`](check-table.html)效劳于[`InnoDB`](innodb-storage-engine.html),[`MyISAM`](myisam-storage-engine.html),[`档案`](archive-storage-engine.html)， 和[`CSV`](csv-storage-engine.html)表。

跑步前[`检查表`](check-table.html)在`InnoDB`表，见[InnoDB 表的检查表使用说明](check-table.html#check-table-innodb).

[`检查表`](check-table.html)支持分区表，您可以使用`ALTER TABLE ...检查分区`检查一个或多个分区；有关详细信息，请参阅[第 13.1.9 节，“ALTER TABLE 语句”](alter-table.html)， 和[第 24.3.4 节，“分区维护”](partitioning-maintenance.html).

[`检查表`](check-table.html)忽略未编入索引的虚拟生成列。

-   [检查表输出](check-table.html#check-table-output)

-   [检查版本兼容性](check-table.html#check-table-version-compatibility)

-   [检查数据一致性](check-table.html#check-table-data-consistency)

-   [InnoDB 表的检查表使用说明](check-table.html#check-table-innodb)

-   [MyISAM 表的 CHECK TABLE 使用说明](check-table.html#check-table-myisam)

##### 检查表输出

[`检查表`](check-table.html)返回具有下表所示列的结果集。

| 柱子 | 价值 |
| --- | --- |
| `桌子` | 表名 |
| `操作` | 总是`查看` |
| `消息类型` | `状态`, `错误`, `信息`, `笔记`， 要么`警告` |
| `消息文本` | 信息性消息 |

该语句可能会为每个检查的表生成许多行信息。最后一行有一个`消息类型`的价值`状态`和`消息文本`通常应该是`好的`.`表已经是最新的`表示该表的存储引擎表明不需要检查该表。

##### 检查版本兼容性

这`升级`选项检查命名表是否与当前版本的 MySQL 兼容。和`升级`，服务器检查每个表以确定自表创建以来表的任何数据类型或索引中是否有任何不兼容的更改。如果不是，则检查成功。否则，如果可能存在不兼容，服务器将对表运行全面检查（这可能需要一些时间）。

由于数据类型的存储格式已更改或其排序顺序已更改，可能会发生不兼容。我们的目标是避免这些更改，但有时它们对于纠正比版本之间的不兼容更糟糕的问题是必要的。

`升级`发现这些不兼容性：

-   结束空间的索引顺序[`文本`](blob.html)列`InnoDB`和`MyISAM`表在 MySQL 4.1 和 5.0 之间发生了变化。

-   新品的存放方法[`十进制`](fixed-point-types.html)数据类型在 MySQL 5.0.3 和 5.0.5 之间更改。

-   有时对需要重建表索引的字符集或排序规则进行更改。有关此类更改的详细信息，请参阅[第 2.11.4 节，“MySQL 8.0 中的更改”](upgrading-from-previous-series.html).有关重建表的信息，请参见[第 2.11.13 节，“重建或修复表或索引”](rebuilding-tables.html).

-   MySQL 8.0 不支持 2 位[`年(2)`](year.html)旧版本的 MySQL 中允许的数据类型。对于包含的表[`年(2)`](year.html)列，[`检查表`](check-table.html)推荐[`维修台`](repair-table.html), 它转换 2 位数字[`年(2)`](year.html)列到 4 位[`年`](year.html)列。

-   触发器创建时间保持不变。

-   如果表包含 5.6.4 之前格式的旧时态列，则表被报告为需要重建 ([`时间`](time.html),[`约会时间`](datetime.html)， 和[`时间戳`](datetime.html)不支持小数秒精度的列）和[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)系统变量被禁用。这有助于 MySQL 升级过程检测和升级包含旧时间列的表。如果[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)已启用，`升级`忽略表中存在的旧时间列；因此，升级过程不会升级它们。

    要检查包含此类临时列并需要重建的表，请禁用[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)在执行之前[`检查表...升级`](check-table.html).

-   对使用非本地分区的表发出警告，因为在 MySQL 8.0 中删除了非本地分区。看[第 24 章，*分区*](partitioning.html).

##### 检查数据一致性

下表显示了可以给出的其他检查选项。这些选项被传递给存储引擎，存储引擎可能会使用或忽略它们。

| 类型 | 意义 |
| --- | --- |
| `快的` | 不要扫描行来检查不正确的链接。适用于`InnoDB`和`MyISAM`表和视图。 |
| `快速地` | 仅检查未正确关闭的表。忽略`InnoDB`;仅适用于`MyISAM`表和视图。 |
| `已更改` | 仅检查自上次检查以来已更改或未正确关闭的表。忽略`InnoDB`; 仅适用于`米萨姆`表和视图。 |
| `中等的` | 扫描行以验证删除的链接是否有效。这还会计算行的键校验和，并使用键的计算校验和进行验证。被忽视`InnoDB`; 仅适用于`米萨姆`表和视图。 |
| `延长` | 对每行的所有键执行完整键查找。这可以确保表格100%一致，但需要很长时间。被忽视`InnoDB`; 仅适用于`米萨姆`表和视图。 |

可以组合检查选项，如下面的示例所示，该示例对表格进行快速检查，以确定其是否已正确关闭：

```
CHECK TABLE test_table FAST QUICK;
```

笔记

如果[`检查表`](check-table.html)发现标记为“已损坏”或“未正确关闭”的表没有问题，[`检查表`](check-table.html)可能会去掉标记。

如果一个表被损坏，问题很可能出现在索引中，而不是数据部分。前面的所有检查类型都会彻底检查索引，因此应该可以找到大多数错误。

要检查您认为可以的表格，请使用“无检查选项”或`快的`选项后者应该在你很匆忙的时候使用，并且可以承担很小的风险`快的`在数据文件中找不到错误。（在大多数情况下，在正常使用情况下，MySQL应该会在数据文件中发现任何错误。如果出现这种情况，表将被标记为“已损坏”，在修复之前无法使用。）

`快速的`和`改变`主要用于从脚本中使用（例如，从**克朗**)定期检查表格。在大多数情况下，`快速的`被优先于`改变`（唯一不喜欢的情况是，当您怀疑在`米萨姆`代码。）

`延长`只有在运行正常检查后，当MySQL试图更新一行或按键查找一行时，仍然会从表中获取错误，才能使用。如果正常检查成功，这是不太可能的。

使用[`检查表。。。延长`](check-table.html)可能会影响查询优化器生成的执行计划。

报告的一些问题[`检查表`](check-table.html)无法自动更正：

-   `找到自动增量列的值为0的行`.

    这意味着表中有一行`自动增量`索引列包含值0。（可以创建一行，其中`自动增量`通过使用[`使现代化`](update.html)声明。）

    这本身并不是一个错误，但如果您决定转储表并恢复它或执行其他操作，则可能会导致问题[`改变桌子`](alter-table.html)在桌子上。在这种情况下`自动增量`列根据的规则更改值`自动增量`列，这可能会导致重复键错误等问题。

    要消除警告，请执行[`使现代化`](update.html)语句将列设置为0以外的值。

##### 检查InnoDB表的表使用说明

以下注释适用于[`InnoDB`](innodb-storage-engine.html)桌子：

-   如果[`检查表`](check-table.html)如果遇到损坏的页面，服务器将退出以防止错误传播（错误#10132）。如果二级索引中发生损坏，但表数据可读，则运行[`检查表`](check-table.html)仍可能导致服务器退出。

-   如果[`检查表`](check-table.html)遭遇腐败`DB_TRX_ID`或`DB_ROLL_PTR`聚集索引中的字段，[`检查表`](check-table.html)可能导致`InnoDB`访问无效的撤消日志记录，导致[MVCC](glossary.html#glos_mvcc)-相关服务器退出。

-   如果[`检查表`](check-table.html)遇到错误`InnoDB`表或索引时，它会报告错误，通常会将索引标记为已损坏，有时会将表标记为已损坏，从而阻止进一步使用索引或表。此类错误包括二级索引中的条目数不正确或链接不正确。

-   如果[`检查表`](check-table.html)如果在辅助索引中找到不正确的条目数，则会报告错误，但不会导致服务器退出或阻止对文件的访问。

-   [`检查表`](check-table.html)调查索引页结构，然后调查每个关键条目。它不会验证指向群集记录的键指针，也不会遵循[`斑点`](blob.html)指针。

-   当`InnoDB`表存储在自己的[`.传染性法氏囊病`文件](glossary.html#glos_ibd_file)前三名[页](glossary.html#glos_page)关于`.传染性法氏囊病`文件包含头信息，而不是表或索引数据。这个[`检查表`](check-table.html)语句不会检测到仅影响头数据的不一致性。验证`InnoDB` `.传染性法氏囊病`文件，使用[**innochecksum**](innochecksum.html)命令

-   跑步时[`检查表`](check-table.html)大体上`InnoDB`表中，其他线程可能会在[`检查表`](check-table.html)处决为了避免超时，将信号量等待阈值（600秒）延长2小时（7200秒）以避免超时[`检查表`](check-table.html)操作。如果`InnoDB`如果检测到信号量等待240秒或更长时间，它就会开始打印`InnoDB`监视错误日志的输出。如果锁请求超出了信号量等待阈值，`InnoDB`中止进程。要完全避免信号量等待超时的可能性，请运行[`快检查桌子`](check-table.html)而不是[`检查表`](check-table.html).

-   [`检查表`](check-table.html)功能`InnoDB` `空间的`索引包括R树有效性检查和确保R树行数与聚集索引匹配的检查。

-   [`检查表`](check-table.html)支持虚拟生成列上的二级索引，这些列由`InnoDB`.

-   从MySQL 8.0.14开始，`InnoDB`支持并行聚集索引读取，这可以提高[`检查表`](check-table.html)表演`InnoDB`在搜索过程中读取聚集索引两次[`检查表`](check-table.html)活动第二次读取可以并行执行。这个[`innodb_并行_读取_线程`](innodb-parameters.html#sysvar_innodb_parallel_read_threads)会话变量必须设置为大于1的值，才能进行并行聚集索引读取。默认值为4。用于执行并行聚集索引读取的实际线程数由[`innodb_并行_读取_线程`](innodb-parameters.html#sysvar_innodb_parallel_read_threads)设置或要扫描的索引子树数，以较小者为准。

##### 查看MyISAM表格的表格使用说明

以下注释适用于[`米萨姆`](myisam-storage-engine.html)桌子：

-   [`检查表`](check-table.html)更新的关键统计数据`米萨姆`桌子。

-   如果[`检查表`](check-table.html)输出不返回`好啊`或`表已经是最新的`，您通常应该对表进行修复。看见[第7.6节，“MyISAM工作台维护和故障恢复”](myisam-table-maintenance.html).

-   如果没有[`检查表`](check-table.html)选项`快的`, `中等的`或`延长`指定了动态格式的默认检查类型`米萨姆`桌子是`中等的`.这与跑步的效果相同[**myisamchk——中号支票*`tbl_名称`***](myisamchk.html)在桌子上。默认的检查类型也是`中等的`对于静态格式`米萨姆`桌子，除非`改变`或`快速的`是指定的。在这种情况下，默认值为`快的`。将跳过对的行扫描`改变`和`快速的`因为行很少被破坏。
