MySQL 修复表

17 Mar 2025 | 5 分钟阅读

如何修复 MySQL 中损坏的表?

MySQL 修复表允许我们修复或修正损坏的表。MySQL 中的修复表仅支持选定的存储引擎,并非所有引擎都支持。它旨在确保我们拥有一些权限,例如使用该语句所需的 SELECTINSERT。通常,我们应避免使用修复表,除非表出现严重问题。此语句很少能从 MyISAM 表中恢复所有数据。因此,我们需要找出表损坏的原因,以避免使用此语句。

当我们执行 REPAIR TABLE 语句时,它首先会检查要修复的表是否需要升级。如果需要,它将按照 CHECK TABLE ... FOR UPGRADE 语句相同的规则执行升级。在执行“修复表”选项之前,务必备份表,因为这可能会导致数据丢失。

语法

以下是在 MySQL 中修复损坏表的语法

让我们详细讨论每个选项的用法。

NO_WRITE_TO_BINLOG 或 LOCAL: 这是服务器负责将 REPAIR TABLE 语句写入复制从库的地方。您可以选择指定 NO_WRITE_TO_BINLOG/LOCAL 关键字来禁止日志记录。

QUICK: QUICK 选项允许 REPAIR TABLE 语句仅修复索引文件。它不允许修复数据文件。这种修复类型的结果与 myisamchk --recover -quick 命令相同。

EXTENDED: 此选项允许 MySQL 一次创建一个索引(通过排序),而不是逐行创建索引。这种修复类型的结果与 myisamchk --safe-recover 命令相同。

USE_FRM: 当找不到 .MYI 索引文件或其头文件损坏时,可以使用此选项。USE-FRM 选项会告知 MySQL 不要信任此文件头中的信息,而是使用数据字典提供的信息重新创建它。这种修复无法与 myisamchk 命令配合使用。

存储引擎和分区支持与修复表

我们之前提到过,修复表并非适用于所有存储引擎。它仅支持 MyISAM、ARCHIVE 和 CSV 表。repair table 语句不支持视图

我们也可以对分区表使用修复表语句。但在此处,我们不能在此语句中使用 USE_FRM 选项。如果要修复多个分区,可以使用 ALTER TABLE ... REPAIR PARTITION 语句。

MySQL 修复表示例

让我们通过示例了解 MySQL 中修复表语句的工作原理。首先,我们需要在选定的数据库中创建一个名为 vehicle 的新表,如下所示:

接下来,我们将使用以下语句向该表中插入一些数据:

接下来,执行以下语句来验证数据:

我们应该得到以下结果:

MySQL REPAIR TABLE

接下来,我们将执行以下语句来检查 vehicle 表的存储引擎:

执行该语句后,我们应该得到以下输出:

MySQL REPAIR TABLE

这里我们可以看到 vehicle 表的存储引擎是 InnoDB。因此,如果使用以下查询为此存储引擎创建修复表,MySQL 将会报错:

请参见下面的输出

MySQL REPAIR TABLE

为了解决此错误,我们首先需要使用以下查询将表存储引擎更改为 MyISAM,然后再使用修复表语句。

我们将获得以下输出

MySQL REPAIR TABLE

在此输出中,我们可以看到 REPAIR TABLE 语句在结果集中包含以下列:

序号列名描述
1.此列指示表的名称。
2.Op无论存储引擎是否支持该语句,此列始终包含“repair”一词。
3.Msg_type此列可以是 status、error、info、note 或 warning。
4.Msg_text此列包含信息性消息。

让我们看另一个示例,使用带有 QUICK、EXTENDED 或 USE_FRM 选项之一的修复表语句。因此,我们将首先创建另一个名为 memberships 的表,并将其存储在 "MyISAM" 存储引擎中,而不是默认的 InnoDB。

我们将使用以下语句向该表中插入一些数据:

接下来,执行 SELECT 语句来验证数据。我们将得到以下结果:

MySQL REPAIR TABLE

由于我们创建了 MyISAM 存储引擎表,因此修复表语句不会报错。请看以下语句:

我们应该得到以下输出:

MySQL REPAIR TABLE

如果我们对当前选定数据库中不存在的表使用 REPAIR TABLE 语句,MySQL 将会显示错误消息。请看以下语句:

执行后,我们将得到以下输出:

MySQL REPAIR TABLE

在本文中,我们学习了如何使用 Repair Table 语句修复 MySQL 中损坏的表。此语句仅对某些存储引擎有效。因此,在使用此查询之前,我们首先检查表存储引擎是否支持它。如果不支持,我们需要将其更改为 MyISAM、ARCHIVE 或 CSV。在执行“修复表”查询之前,务必备份表,因为这可能会导致数据丢失。