了解MYSQL的都知道,在MYSQL中创建任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每一个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件能够用来在数据库崩溃时恢复表结构。
下面说说如何经过.frm文件恢复数据表结构。
一. InnoDB表结构的恢复
假定:MYSQL数据库已经崩溃,目前只有对应表的frm文件,你们都知道,frm文件没法经过文本编辑器查看,由于若是不恢复,基本上来讲对咱们没什么用。这里咱们为了测试,假定该文件为test_innodb.frm.
该表建立脚本以下:
mysql> create table test_innodb
-> (A int(11) default NULL,
-> B varchar(30) default NULL,
-> C date default 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 not null)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
-> (A int(11) default NULL,
-> B varchar(30) default NULL,
-> C date default 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