本节介绍如何重建或修复表或索引,这可能是由以下原因造成的:
MySQL 处理数据类型或字符集的方式发生了变化。例如,排序规则中的错误可能已得到纠正,因此需要重建表以更新使用该排序规则的字符列的索引。
CHECK TABLE
或 mysqlcheck 报告的所需的表修复或升级。
重建表的方法包括:
如果因为不同版本的 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
语句将表“更改”为使用其已有的存储引擎。例如,如果 t1
是 InnoDB
表,请使用以下语句:
ALTER TABLE t1 ENGINE = InnoDB;
如果不确定在 ALTER TABLE
语句中指定哪个存储引擎,请使用 SHOW CREATE TABLE
显示表定义。
REPAIR TABLE
方法仅适用于 MyISAM
、ARCHIVE
和 CSV
表。
如果表检查操作指示存在损坏或需要升级,则可以使用 REPAIR TABLE
。例如,要修复 MyISAM
表,请使用以下语句:
REPAIR TABLE t1;
mysqlcheck --repair 提供对 REPAIR TABLE
语句的命令行访问。这可能是修复表的一种更方便的方法,因为可以使用 --databases
或 --all-databases
选项分别修复特定数据库或所有数据库中的所有表:
mysqlcheck --repair --databases db_name ...
mysqlcheck --repair --all-databases