MYSQL数据文件--.frm文件(表结构恢复)

时间:2021-12-14 00:28:11

了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构。

 

下面说说如何通过.frm文件恢复数据表结构。

 

. InnoDB表结构的恢复

 

假定:MYSQL数据库已经崩溃,目前只有对应表的frm文件,大家都知道,frm文件无法通过文本编辑器查看,因为如果不恢复,基本上来说对我们没什么用。这里我们为了测试,假定该文件为test_innodb.frm.

 

该表创建脚本如下:

 

mysql> create table test_innodb

 

    -> (Aint(11) default NULL,

    -> Bvarchar(30) default NULL,

    -> C datedefault NULL) engine=innodb;

Query OK, 0 rows affected (0.05 sec)

 

恢复方法介绍(过程)

 

1. 在新的正常工作的MYSQL环境下建立一个数据库,比如aa.

 

2. aa数据库下建立同名的数据表test_innodb,表结构随意,这里只有一个id字段,操作过程片段如下:

 

mysql> create table test_innodb (id bigint notnull)engine=InnoDB;

Query OK, 0 rows affected (0.09 sec)

 

mysql> show tables;

+--------------+

| Tables_in_aa |

+--------------+

| test_innodb |

+--------------+

2 rows in set (0.00 sec)

 

mysql> desc test_innodb;

+-------+------------+------+-----+---------+-------+

| Field | Type      | Null | Key | Default | Extra |

+-------+------------+------+-----+---------+-------+

| id    |bigint(20) | NO   |     | NULL   |       |

+-------+------------+------+-----+---------+-------+

1 row in set (0.00 sec)

 

3.停止mysql服务器,将系统崩溃后留下的test_innodb.frm文件拷贝到新的正常数据库的数据目录aa下,覆盖掉下边同名的frm文件:

 

4.重新启动MYSQL服务。

 

5.测试下是否恢复成功,进入aa数据库,用desc命令测试下:

 

mysql> desc test_innodb;

+-------+-------------+------+-----+---------+-------+

| Field | Type       | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| A     |int(11)     | YES  |     |NULL    |       |

| B     |varchar(30) | YES  |     | NULL   |       |

| C     |date        | YES  |     |NULL    |       |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

 

OK,发现表结构已经恢复过来了。

 

. MyISAM表结构的恢复。

 

MyISAM类型的表恢复相对比较简单。

 

同样先假定需要恢复的表的FRM文件为test_myisam.frm,表结构为

 

mysql> create table test_myisam

    -> (Aint(11) default NULL,

    -> Bvarchar(30) default NULL,

    -> C datedefault NULL) engine=myisam;

Query OK, 0 rows affected (0.05 sec)

 

恢复过程如下:

 

1. 直接将test_myisam.frm拷贝到正常数据库对应的数据目录下。这时测试

 

mysql> show tables;

+--------------+

| Tables_in_aa |

+--------------+

| test_innodb |

| test_myisam |

+--------------+

3 rows in set (0.00 sec)

 

mysql> desc test_myisam;

ERROR 1017 (HY000): Can't find file: 'test_myisam'(errno: 2)

 

发现只能通过show tables命令看见表名,但是表结构还是没有恢复,desc命令报错。

 

2. 在与test_myisam.frm同一目录建立以下2个文件,文件内容可以为空:

 

test_myisam.MYD test_myisam.MYI

 

3. MYSQL命令行使用MYSQL本身的数据表恢复命令repair命令恢复表,如下:

 

mysql> repair table test_myisam USE_FRM;

+-----------------+--------+----------+----------+

| Table          | Op     | Msg_type | Msg_text |

+-----------------+--------+----------+----------+

| aa.test_myisam | repair | status   | OK       |

+-----------------+--------+----------+----------+

1 row in set (0.00 sec)

 

根据结果可以知道,恢复命令执行成功,下边用desc命令测试下:

 

mysql> desc test_myisam;

+-------+-------------+------+-----+---------+-------+

| Field | Type       | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| A     |int(11)     | YES  |     |NULL    |       |

| B     |varchar(30) | YES  |     | NULL   |       |

| C     |date        | YES  |     |NULL    |       |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.02 sec)

 

果然恢复成功了。

 

也可以用show create table命令测试下:

 

mysql> show create table test_myisam;

+--------------+-----------------------------------------------------------------

----------------------------------------------------------------------+

| Table        |Create Table

                                                                     |

+--------------+-----------------------------------------------------------------

----------------------------------------------------------------------+

| test_myisam | Create TABLE `test_myisam` (

  `A` int(11)DEFAULT NULL,

  `B`varchar(30) DEFAULT NULL,

  `C` dateDEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

+--------------+-----------------------------------------------------------------

----------------------------------------------------------------------+

 

在恢复MyISAM表结构时,提到MYD文件和MYI文件,这两个文件都专属于MyISAM存储引擎的,前者用来保存MyISAM表的数据,后者用来存放MyISAM表的索引信息。具体在以后的日志再做详细介绍,这里不再赘述。