MySQL 8.4 Reference Manual  /  Upgrading MySQL  /  Rebuilding or Repairing Tables or Indexes

3.14 重建或修复表或索引

本节描述了如何重建或修复表或索引,这可能是由以下原因所 necessitated:

  • MySQL 对数据类型或字符集的更改。例如,可能出现的错误可能已经被纠正,需要重建表以更新使用该字符集的索引中的字符列。

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

重建表的方法包括:

如果您需要重建表,因为不同的 MySQL 版本不能处理它们在升级或降级时,您必须使用 dump-and-reload 方法。使用原始版本的 MySQL 将表dump before 升级或降级,然后在升级或降级后重新加载表。

如果您使用 dump-and-reload 方法重建表,只是为了重建索引,您可以在升级或降级前或后执行 dump 操作。重新加载仍然需要在升级或降级后。

如果您需要重建 InnoDB 表,因为 CHECK TABLE 操作表明需要升级,请使用 mysqldump 创建 dump 文件,然后使用 mysql 重新加载文件。如果 CHECK TABLE 操作表明存在损坏或导致 InnoDB 失败,请参阅 Section 17.20.3, “Forcing InnoDB Recovery”,了解如何使用 innodb_force_recovery 选项重新启动 InnoDB。要了解 CHECK TABLE 可能遇到的问题,请参阅 InnoDB 备注在 Section 15.7.3.2, “CHECK TABLE Statement” 中。

要重建一个表,可以使用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重建一个表,可以使用一个“null”变更,即一个ALTER TABLE语句,该语句将表更改为使用它当前使用的存储引擎。例如,如果t1是一个InnoDB表,可以使用以下语句:

ALTER TABLE t1 ENGINE = InnoDB;

如果您不确定在ALTER TABLE语句中指定的存储引擎,可以使用SHOW CREATE 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