MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
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 命令的工作效果相同。
扩展: 而不是逐行创建索引,此选项允许 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 REPAIR TABLE
接下来,我们将执行以下语句以检查车辆表的存储引擎:
mysql> SELECT table_name, engine 
FROM information_schema.tables 
WHERE table_name = 'vehicle';
执行该语句后,我们应该获得以下输出:
MySQL REPAIR TABLE
在这里我们可以看到车辆表的存储引擎是InnoDB。因此,如果我们使用以下查询为此存储引擎创建修复表,则MySQL会发出错误:
mysql> REPAIR TABLE vehicle;
请参见以下输出:
MySQL REPAIR TABLE
要消除此错误,我们首先需要使用以下查询将表存储引擎更改为MyISAM,然后使用修复表语句。
mysql> ALTER TABLE vehicle ENGINE = 'MyISAM';
//Now, use the repair table query 
mysql> REPAIR TABLE vehicle;
我们将获得以下输出:
MySQL REPAIR TABLE
在此输出,我们可以看到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语句以验证数据。我们将得到以下结果:
MySQL REPAIR TABLE
由于我们创建了MyISAM存储引擎表,修复表语句不会发出任何错误。请参阅以下语句:
mysql> REPAIR TABLE memberships QUICK EXTENDED;
我们应该得到如下输出:
MySQL REPAIR TABLE
如果使用如果REPAIR TABLE语句中包含我们选择的数据库中不存在的表,MySQL会给出一条错误消息。请参阅以下语句:
mysql> REPAIR TABLE service_memberships QUICK EXTENDED;
执行后,我们将获得以下输出:
MySQL REPAIR TABLE
在在本文中,我们学习了如何使用Repair Table语句在MySQL中修复损坏的表。该语句仅适用于某些存储引擎。因此,在使用此查询之前,我们首先检查表存储引擎是否支持它。如果不支持,则需要将其更改为MyISAM,ARCHIVE或CSV。在执行"表修复"查询之前,最好保留表的备份,因为这可能会导致数据丢失。

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4