MySQL 修复表

2024年03月27日 MySQL 修复表 极客笔记

MySQL 修复表

如何修复MySQL中的损坏表?

MySQL修复表允许我们修复或修复损坏的表。MySQL中的修复表仅支持选定的存储引擎,而不是所有存储引擎。这是为了确保我们拥有一些权限,如SELECT和INSERT,才能使用该语句。通常情况下,除非表发生灾难性的事情,我们不应使用修复表。这个语句很少从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 命令的结果相同。

EXTENDED: 此选项允许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;

我们应该得到以下结果:

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

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

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

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

mysql> REPAIR TABLE vehicle;

查看下面的输出:

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

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

我们将得到以下输出:

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

SN 列名 描述
1. 表格 此列指示表格的名称。
2. Op 此列始终包含指示存储引擎是否支持修复词语的语句。
3. Msg_type 此列可以是状态、错误、信息、注释或警告。
4. Msg_text 此列由信息消息组成。

让我们再看一个示例,使用修复表语句与任何QUICK、EXTENDED或USE_FRM选项。因此,我们首先将创建另一个名为 memberships 的表,并将该表存储在“ 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语句以验证数据。我们将得到以下结果:

自从我们创建了MyISAM存储引擎表,修复表语句就不会出现任何错误。请看下面的语句:

mysql> REPAIR TABLE memberships QUICK EXTENDED;

我们应该得到以下输出:

如果我们使用REPAIR TABLE语句来修复在我们选择的数据库中不存在的表,MySQL将显示错误信息。请参考下面的语句:

mysql> REPAIR TABLE service_memberships QUICK EXTENDED;

执行完后,我们将会得到如下输出:

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

本文链接:http://so.lmcjl.com/news/505/

展开阅读全文