转自:http://blog.csdn.net/chuan122345/archive/2009/12/06/4951936.aspx 了解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)
恢复方法介绍(过程):
在新的正常工作的MYSQL环境下建立一个数据库,比如aa.
在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)
恢复过程如下:
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命令报错。
test_myisam.MYD test_myisam.MYI
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
date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ‘ +————–+—————————————————————– ———————————————————————-+
在恢复MyISAM表结构时,提到MYD文件和MYI文件,这两个文件都专属于MyISAM存储引擎的,前者用来保存MyISAM表的数据,后者用来存放MyISAM表的索引信息。具体在以后的日志再做详细介绍,这里不再赘述。