mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
了解MYSQL的都知道,在MYSQL中建立任何一張數(shù)據(jù)表,在其數(shù)據(jù)目錄對應的數(shù)據(jù)庫目錄下都有對應表的.frm文件,.frm文件是用來保存每個數(shù)據(jù)表的元數(shù)據(jù)(meta)信息,包括表結(jié)構(gòu)的定義等,.frm文件跟數(shù)據(jù)庫存儲引擎無關(guān),也就是任何存儲引擎的數(shù)據(jù)表都必須有.frm文件,命名方式為數(shù)據(jù)表名.frm,如user.frm. .frm文件可以用來在數(shù)據(jù)庫崩潰時恢復表結(jié)構(gòu)。
下面說說如何通過.frm文件恢復數(shù)據(jù)表結(jié)構(gòu)。
一. InnoDB表結(jié)構(gòu)的恢復
假定:MYSQL數(shù)據(jù)庫已經(jīng)崩潰,目前只有對應表的frm文件,大家都知道,frm文件無法通過文本編輯器查看,因為如果不恢復,基本上來說對我們沒什么用。這里我們?yōu)榱藴y試,假定該文件為test_innodb.frm.
該表創(chuàng)建腳本如下:
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環(huán)境下建立一個數(shù)據(jù)庫,比如aa.
2. 在aa數(shù)據(jù)庫下建立同名的數(shù)據(jù)表test_innodb,表結(jié)構(gòu)隨意,這里只有一個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服務(wù)器,將系統(tǒng)崩潰后留下的test_innodb.frm文件拷貝到新的正常數(shù)據(jù)庫的數(shù)據(jù)目錄aa下,覆蓋掉下邊同名的frm文件:
4.重新啟動MYSQL服務(wù)。
5.測試下是否恢復成功,進入aa數(shù)據(jù)庫,用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,發(fā)現(xiàn)表結(jié)構(gòu)已經(jīng)恢復過來了。
二. MyISAM表結(jié)構(gòu)的恢復。
MyISAM類型的表恢復相對比較簡單。
同樣先假定需要恢復的表的FRM文件為test_myisam.frm,表結(jié)構(gòu)為
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拷貝到正常數(shù)據(jù)庫對應的數(shù)據(jù)目錄下。這時測試
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)
發(fā)現(xiàn)只能通過show tables命令看見表名,但是表結(jié)構(gòu)還是沒有恢復,desc命令報錯。
2. 在與test_myisam.frm同一目錄建立以下2個文件,文件內(nèi)容可以為空:
test_myisam.MYD test_myisam.MYI
3. 在MYSQL命令行使用MYSQL本身的數(shù)據(jù)表恢復命令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)
根據(jù)結(jié)果可以知道,恢復命令執(zhí)行成功,下邊用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表結(jié)構(gòu)時,提到MYD文件和MYI文件,這兩個文件都專屬于MyISAM存儲引擎的,前者用來保存MyISAM表的數(shù)據(jù),后者用來存放MyISAM表的索引信息。具體在以后的日志再做詳細介紹,這里不再贅述。
From:http://blog.sina.com.cn/s/blog_5d3da3280100hymn.html
總結(jié)
以上是生活随笔為你收集整理的mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python申请内存函数_Python
- 下一篇: java 建立ssh隧道_JAVA SS