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 命令的工作效果相同。
扩展: 而不是逐行创建索引,此选项允许 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语句在结果集中包含以下列:
列名 |
说明 |
Table |
此列指示表的名称。 |
Op |
无论存储引擎是否支持该语句,此列始终包含修复字。 |
Msg_type |
此列可以是状态,错误,信息,注释或警告。 |
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@lidihuo.com', 'Gold', '2020-06-13'),
('Jenifer', 'jenifer@lidihuo.com', 'Platinum', '2020-06-10'),
('david', 'david@lidihuo.com', 'Silver', '2020-06-15');
接下来,执行SELECT语句以验证数据。我们将得到以下结果:
由于我们创建了MyISAM存储引擎表,修复表语句不会发出任何错误。请参阅以下语句:
mysql> REPAIR TABLE memberships QUICK EXTENDED;
我们应该得到如下输出:
如果使用如果REPAIR TABLE语句中包含我们选择的数据库中不存在的表,MySQL会给出一条错误消息。请参阅以下语句:
mysql> REPAIR TABLE service_memberships QUICK EXTENDED;
执行后,我们将获得以下输出:
在在本文中,我们学习了如何使用Repair Table语句在MySQL中修复损坏的表。该语句仅适用于某些存储引擎。因此,在使用此查询之前,我们首先检查表存储引擎是否支持它。如果不支持,则需要将其更改为MyISAM,ARCHIVE或CSV。在执行"表修复"查询之前,最好保留表的备份,因为这可能会导致数据丢失。