Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

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 可能遇到的问题类型,请参阅 InnoDB 备注 第 15.7.3.2 节,“CHECK TABLE 语句”

要通过转储和重新加载重建表,使用 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 重建表,使用“空”修改;即,使用 ALTER TABLE 语句将表更改为使用当前存储引擎。例如,如果 t1InnoDB 表,使用以下语句:

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