### 2.11.13 重建或修复表或索引

[](<>)[](<>)[](<>)

本节介绍如何重建或修复表或索引，这可能是必要的：

-   更改 MySQL 处理数据类型或字符集的方式。例如，排序规则中的错误可能已得到纠正，需要重新构建表以更新使用排序规则的字符列的索引。

-   所需的表维修或升级报告由[`检查表`](check-table.html),[**mysql检查**](mysqlcheck.html)， 要么[**mysql\_升级**](mysql-upgrade.html).

    重建表的方法包括：

-   [转储和重新加载方法](rebuilding-tables.html#rebuilding-tables-dump-reload)

-   [ALTER TABLE 方法](rebuilding-tables.html#rebuilding-tables-alter-table)

-   [修复表方法](rebuilding-tables.html#rebuilding-tables-repair-table)

#### 转储和重新加载方法

如果您正在重建表，因为不同版本的 MySQL 在二进制（就地）升级或降级后无法处理它们，则必须使用 dump-and-reload 方法。转储表格*前*使用原始版本的 MySQL 升级或降级。然后重新加载表*后*升级或降级。

如果您使用 dump-and-reload 重建表的方法仅用于重建索引，则可以在升级或降级之前或之后执行转储。之后仍然必须重新加载。

如果你需要重建一个`InnoDB`表，因为[`检查表`](check-table.html)操作表示需要升级表，使用[**mysql转储**](mysqldump.html)创建转储文件和[**mysql**](mysql.html)重新加载文件。如果[`检查表`](check-table.html)操作表明存在损坏或原因`InnoDB`失败，请参阅[第 15.21.3 节，“强制 InnoDB 恢复”](forcing-innodb-recovery.html)有关使用[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)重启选项`InnoDB`.了解问题的类型[`检查表`](check-table.html)可能会遇到，参考`InnoDB`中的注释[第 13.7.3.2 节，“CHECK TABLE 语句”](check-table.html).

要通过转储和重新加载表来重建表，请使用[**mysql转储**](mysqldump.html)创建转储文件和[**mysql**](mysql.html)重新加载文件：

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

要重建单个数据库中的所有表，请指定数据库名称而不指定任何以下表名称：

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

要重建所有数据库中的所有表，请使用[`--所有数据库`](mysqldump.html#option_mysqldump_all-databases)选项：

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

#### ALTER TABLE 方法

重建一个表[`更改表`](alter-table.html), 使用“null”更改；也就是说，一个[`更改表`](alter-table.html)“更改”表以使用它已有的存储引擎的语句。例如，如果`t1`是一个`InnoDB`表，使用这个语句：

```
ALTER TABLE t1 ENGINE = InnoDB;
```

如果您不确定要在[`更改表`](alter-table.html)声明，使用[`显示创建表`](show-create-table.html)显示表定义。

#### 修复表方法

这[`维修台`](repair-table.html)方法只适用于`MyISAM`,`档案`， 和`CSV`表。

您可以使用[`维修台`](repair-table.html)如果表检查操作表明存在损坏或需要升级。例如，要修复一个`MyISAM`表，使用这个语句：

```
REPAIR TABLE t1;
```

[**mysqlcheck --修复**](mysqlcheck.html)提供命令行访问[`维修台`](repair-table.html)陈述。这可能是一种更方便的修复表的方法，因为您可以使用[`--数据库`](mysqlcheck.html#option_mysqlcheck_databases)要么[`--所有数据库`](mysqlcheck.html#option_mysqlcheck_all-databases)分别修复特定数据库或所有数据库中的所有表的选项：

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