程序员社区

MySQL系列教程 --- 22、MySQL修复损坏的表

MySQL 修复表允许我们修复或修复损坏的表。MySQL 中的修复表仅支持选定的存储引擎,而不支持所有. 就是保证我们有SELECTINSERT这样的几个权限来使用这个语句。通常情况下,我们不应该使用修理台,直到表发生灾难性的事情。此语句很少从MyISAM表中获取所有数据。因此,我们需要找出我们的表损坏的原因,以消除使用此语句。

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

句法

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

REPAIR [NO_WRITE_TO_BINLOG | LOCAL]  
    TABLE tbl_name [, tbl_name] ...  
    [QUICK] [EXTENDED] [USE_FRM]  

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

NO_WRITE_TO_BINLOG 或 LOCAL:这是服务器负责为复制从站编写 REPAIR TABLE 语句的地方。我们可以选择指定可选的 NO_WRITE_TO_BINLOG/LOCAL 关键字来抑制日志记录。

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

扩展:此选项允许MySQL 一次创建一个索引,而不是逐行创建索引。这种类型的修复与myisamchk --safe-recover命令的工作结果相同。

USE_FRM:当未找到.MYI索引文件或其标头损坏时使用此选项。USE-FRM 选项通知 MySQL 不信任此文件头中存在的信息,并使用数据字典中提供的信息重新创建它。这种类型的修复不能与myisamchk命令一起使用。

带有修复表的存储引擎和分区支持

我们之前已经提到修复表不适用于所有存储引擎。它仅支持 MyISAM、ARCHIVE 和 CSV 表。该维修表语句不支持的意见

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

MySQL 修复表示例

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

CREATE TABLE vehicle (  
    vehicle_no VARCHAR(18) PRIMARY KEY,  
    model_name VARCHAR(45),  
    cost_price DECIMAL(10,2 ),  
    sell_price DECIMAL(10,2)  
);  

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

mysql> INSERT INTO vehicle (vehicle_no, model_name, cost_price, sell_price)   
VALUES('S2001', 'Scorpio', 950000, 1000000),  
('M3000', 'Mercedes', 2500000, 3000000),  
('R0001', 'Rolls Royas', 75000000, 85000000);  

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

mysql> SELECT * FROM vehicle;  

我们应该得到以下结果:

file

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

mysql> SELECT table_name, engine   
FROM information_schema.tables   
WHERE table_name = 'vehicle';  

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

file

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

mysql> REPAIR TABLE vehicle;  

请参阅以下输出:

file

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

mysql> ALTER TABLE vehicle ENGINE = 'MyISAM';  
//Now, use the repair table query   
mysql> REPAIR TABLE vehicle;  

我们将得到以下输出:

file

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

SN 列名 说明
1. Table 此列指示表的名称。
2. Op 无论存储引擎是否支持该语句,该列始终包含修复字。
3. Msg_type 此列可以是状态、错误、信息、注释或警告。
4. Msg_text 此列包含信息性消息。

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

CREATE TABLE memberships (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    name VARCHAR(55) NOT NULL,  
    email VARCHAR(55) NOT NULL,  
    plan VARCHAR(45) NOT NULL,  
    validity_date DATE NOT NULL  
) ENGINE = MyISAM;   

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

mysql> INSERT INTO memberships (name, email, plan, validity_date)  
VALUES('Stephen', 'stephen@javatpoint.com', 'Gold', '2020-06-13'),  
      ('Jenifer', 'jenifer@javatpoint.com', 'Platinum', '2020-06-10'),  
      ('david', 'david@javatpoint.com', 'Silver', '2020-06-15');  

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

file

由于我们已经创建了 MyISAM 存储引擎表,因此修复表语句不会发出任何错误。请参阅以下声明:

mysql> REPAIR TABLE memberships QUICK EXTENDED;  

我们应该得到如下输出:

file

如果我们对所选数据库中不存在的表使用 REPAIR TABLE 语句,MySQL 会给出错误消息。请参阅以下声明:

mysql> REPAIR TABLE service_memberships QUICK EXTENDED;  

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

file

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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » MySQL系列教程 --- 22、MySQL修复损坏的表

一个分享Java & Python知识的社区