3.14 重建或修复表或索引
本节描述了如何重建或修复表或索引,这可能是由以下原因所 necessitated:
-
MySQL 对数据类型或字符集的更改。例如,可能出现的错误可能已经被纠正,需要重建表以更新使用该字符集的索引中的字符列。
-
由
CHECK TABLE
或 mysqlcheck 报告的必需的表修复或升级。
重建表的方法包括:
如果您需要重建表,因为不同的 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方法仅适用于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