MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)

转载 2013年12月02日 15:41:58
了解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
                                                                      |
+--------------+-----------------------------------------------------------------
----------------------------------------------------------------------+
| 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表的索引信息。具体在以后的日志再做详细介绍,这里不再赘述。
 From:
http://blog.sina.com.cn/s/blog_5d3da3280100hymn.html

相关文章推荐

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

了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm...

MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)

了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm...

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

一次恢复数据库表结构和数据的实战,仅以此贴作为记录。   由于,前几天我们使用的数据库被入侵(顺便鄙视一下安全管理人员),数据库中的表都显示不存在(仅剩一个黑客自建的----qq_xxxxx的表,但物...

mysql frm ibd 文件恢复数据

另外准备一份mysql环境,版本等要一样。 随便创建一个数据库 1.在里面建一个表 CREATE TABLE `xxx` (   `id` int(32) NOT NULL AUTO_INCRE...

mysql未通过正常导出,服务器挂掉时通过frm文件恢复遇到问题

这里说的MySql恢复数据库,是指没有通过正常备份的情况下,通过Mysql保存的数据文件如何恢复数据库...

mysql从.frm和.ibd文件恢复数据库

下载 MySQL Utilities http://dev.mysql.com/downloads/utilities/ 需要安装https://www.microsoft.com/...

为什么我的mysql数据库里的表只有frm文件

因为用的是INNODB存储引擎。  1。导出表数据及表结构为SQL, 2。删除旧表(删除前先备份) 3。修改导出后的SQL,将INNODB替换成MYISAM 4。导入表数据及表结构   ...

为什么MySQL表只对应一个.frm文件,没有.MYD 和.MYI文件

今天在学习MySQL的时候,发现新建一个数据库表的时候,表只对应一个.frm文件,却没有.MYD 和.MYI文件。 经过一番查找之后才发现,我本地的MySQL存储表的时候,使用的默认数据库存储引擎是...
  • yhawaii
  • yhawaii
  • 2011年12月19日 16:41
  • 8348

mysql数据文件

  • 2017年06月06日 23:31
  • 389B
  • 下载

Mysql数据文件恢复

起因:mysql服务停止后,重启无法启动,且mysql错误日志xxxxx.err无任何报错信息,权限和磁盘空间都排查过无任何异常,原因不明。思路:模拟服务器环境,复制安装文件和mysql数据文件到本地...
  • whylazy
  • whylazy
  • 2016年10月18日 11:17
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
举报原因:
原因补充:

(最多只允许输入30个字)