MySQL 8.4 参考手册  /  升级 MySQL  /  重建或修复表或索引

3.14 重建或修复表或索引

本节介绍如何重建或修复表或索引,这可能由以下原因引起:

  • MySQL 处理数据类型或字符集的方式发生了更改。例如,排序规则中的错误可能已被更正,因此需要重建表以更新使用该排序规则的字符列的索引。

  • CHECK TABLEmysqlcheck 报告的必需表修复或升级。

重建表的方法包括:

转储和重新加载方法

如果您是在二进制(就地)升级或降级后由于不同版本的 MySQL 无法处理表而重建表,则必须使用转储和重新加载方法。使用原始版本的 MySQL 在升级或降级 之前 转储表。然后在升级或降级 之后 重新加载表。

如果您仅为了重建索引的目的而使用转储和重新加载方法重建表,则可以在升级或降级之前或之后执行转储。重新加载仍然必须在之后进行。

如果您需要重建一个 InnoDB 表,因为 CHECK TABLE 操作表明需要表升级,请使用 mysqldump 创建一个转储文件,并使用 mysql 重新加载该文件。如果 CHECK TABLE 操作表明存在损坏或导致 InnoDB 失败,请参考 第 17.20.3 节,“强制 InnoDB 恢复”,了解有关使用 innodb_force_recovery 选项重新启动 InnoDB 的信息。要了解 CHECK TABLE 可能遇到的问题类型,请参考 第 15.7.3.2 节,“CHECK TABLE 语句” 中的 InnoDB 说明。

要通过转储和重新加载重建表,请使用 mysqldump 创建转储文件,并使用 mysql 重新加载该文件

mysqldump db_name t1 > dump.sql
mysql db_name < dump.sql

要重建单个数据库中的所有表,请指定数据库名称,不带任何后续表名称

mysqldump db_name > dump.sql
mysql db_name < dump.sql

要重建所有数据库中的所有表,请使用 --all-databases 选项

mysqldump --all-databases > dump.sql
mysql < dump.sql

ALTER TABLE 方法

要使用 ALTER TABLE 重建表,请使用 null 修改;也就是说,一个 ALTER TABLE 语句,它 更改 表以使用它已有的存储引擎。例如,如果 t1 是一个 InnoDB 表,请使用以下语句

ALTER TABLE t1 ENGINE = InnoDB;

如果您不确定在 ALTER TABLE 语句中指定哪个存储引擎,请使用 SHOW CREATE TABLE 显示表定义。

REPAIR TABLE 方法

REPAIR TABLE 方法仅适用于 MyISAMARCHIVECSV 表。

如果您可以在表检查操作表明存在损坏或需要升级时使用 REPAIR TABLE。例如,要修复一个 MyISAM 表,请使用以下语句

REPAIR TABLE t1;

mysqlcheck --repair 提供对 REPAIR TABLE 语句的命令行访问。这可能是修复表的更便捷方式,因为您可以使用 --databases--all-databases 选项分别修复特定数据库或所有数据库中的所有表

mysqlcheck --repair --databases db_name ...
mysqlcheck --repair --all-databases