我們知道MySQL中如果用的是MYISAM數(shù)據(jù)引擎,那么數(shù)據(jù)很好恢復(fù),只要將相應(yīng).frm, .MYD, .MYI文件拷貝過去即可。但是如果是innodb的話,如果開啟innodb_file_per_table=1,則每一個數(shù)據(jù)表都是一個單獨的文件,比如User表,則會建立User.frm和User.ibd.
那么直接拷貝這兩個文件到新的MySQL數(shù)據(jù)目錄下可以嗎,一般來說是不行的,那么什么時候可以呢?只有在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。
那么怎么辦呢?根據(jù)之前講的,innodb恢復(fù)不了就是因為table space id不匹配導(dǎo)致的。所以我們可以這樣做 (以zhc_db數(shù)據(jù)庫為例):
1 首先將當(dāng)前mysql數(shù)據(jù)目錄下的ibdata1文件和zhc_db下邊的frm和ibd文件備份。
2 將之前要恢復(fù)的ibdata1和frm和ibd文件拷貝到當(dāng)前的mysql數(shù)據(jù)目錄下,進行覆蓋。注意因為當(dāng)前數(shù)據(jù)庫可能還有其它數(shù)據(jù)庫和表,所以這一步可能導(dǎo)致其它數(shù)據(jù)庫出現(xiàn)問題。不過沒關(guān)系,因為我們已經(jīng)備份了。
3 保險起見,重啟一下mysql吧,service mysql restart
4 直接登錄到zhc_db數(shù)據(jù)庫,mysql -u root -p zhc_db; 這時候你就可以show tables和select了,激動了吧,看到你的數(shù)據(jù)了吧。
5 將此數(shù)據(jù)庫用mysqldump導(dǎo)出,mysqldump -u root -p[password] zhc_db > dump_zhc_db.sql
好了,你已經(jīng)有了以前的數(shù)據(jù)和表定義。
6 最后一步,別忘了,將ibdata1文件和zhc_db下邊的文件用之前的備份進行恢復(fù)。
7 重啟mysql,然后你就可以將你的數(shù)據(jù)進行導(dǎo)入了。注意目錄的權(quán)限一定是MySQL可讀寫的。
.frm恢復(fù)表結(jié)構(gòu)
溫馨提示:如果你已經(jīng)恢復(fù)了表數(shù)據(jù),可以直接忽略此操作,開始下一步操作
MySql創(chuàng)建每張表后都會在“mysql安裝目錄/data/數(shù)據(jù)庫名/”目錄下創(chuàng)建一個“表名.frm”文件。
該.frm文件并不能直接打開,但是它可以幫助你恢復(fù)你的表結(jié)構(gòu)~~
具體操作如下:
1、準(zhǔn)備恢復(fù)bhusk數(shù)據(jù)庫中的表結(jié)構(gòu),其中bhusk數(shù)據(jù)庫中包含了admin表。
2、我們首先連接數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫bhusk,自己可視化工具或許會快一點
create database bhusk;
3、然后在該數(shù)據(jù)庫下創(chuàng)建表admin ,只需要包含一個簡單的字段便可,主要是創(chuàng)建出一個同名的表,方便接下來的替換。
create table `admin`( id varchar(32) not null);
4、這一步請將mysql數(shù)據(jù)庫服務(wù)關(guān)閉
5、將之前舊的數(shù)據(jù)庫留下來的/data/bhusk/admin.frm文件覆蓋掉現(xiàn)在新的數(shù)據(jù)庫/data/bhusk目錄下的admin.frm文件。
6、給這個admin.frm加權(quán)限,所有者mysql ,權(quán)限660(你可以參考別的ibd文件所有者和權(quán)限設(shè)置) (這一步幾乎可以忽略)此步為linux權(quán)限操作
7、最后啟動數(shù)據(jù)庫,可以查表結(jié)構(gòu)了
.idb恢復(fù)表數(shù)據(jù)
1、 現(xiàn)在admin表結(jié)構(gòu)有了,開始準(zhǔn)備恢復(fù)數(shù)據(jù),如果通過以上方法恢復(fù)表結(jié)構(gòu),那一定在/data/bhusk/目錄下會有admin.idb文件。
2、接下來執(zhí)行alter table `admin` discard tablespace ;執(zhí)行完之后,數(shù)據(jù)庫目錄下的user.ibd文件就沒了
3、把你備份的ibd放到消失的admin.ibd文件那里。
4、給這個文件加權(quán)限,所有者mysql ,權(quán)限660(你可以參考別的ibd文件所有者和權(quán)限設(shè)置)(這一步幾乎可以忽略)此步為linux權(quán)限操作
5、執(zhí)行 alter table admin import tablespace; 執(zhí)行完,表數(shù)據(jù)就可讀了,這時候會丟失一些諸如表行記錄數(shù)等存在系統(tǒng)表里的信息,不過那些信息無所謂。表其實這時候已經(jīng)可以正常用了。如果不放心,可以導(dǎo)出sql語句或txt,再創(chuàng)建表導(dǎo)入。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答?。?點擊進入論壇