1. 程式人生 > >MySQL利用frm和idb檔案進行資料恢復

MySQL利用frm和idb檔案進行資料恢復

我們知道MySQL中如果用的是MYISAM資料引擎,那麼資料很好恢復,只要將相應.frm, .MYD, .MYI檔案拷貝過去即可。但是如果是innodb的話,如果開啟innodb_file_per_table=1,則每一個數據表都是一個單獨的檔案,比如User表,則會建立User.frm和User.ibd.

那麼直接拷貝這兩個檔案到新的MySQL資料目錄下可以嗎,一般來說是不行的,那麼什麼時候可以呢?只有在你的ibd檔案的tablespace id和ibdata1檔案中的元資訊的tablespace id一致才可以。

那麼怎麼辦呢?根據之前講的,innodb恢復不了就是因為table space id不匹配導致的。所以我們可以這樣做 (以zhc_db資料庫為例):

1 首先將當前mysql資料目錄下的ibdata1檔案和zhc_db下邊的frm和ibd檔案備份。

2 將之前要恢復的ibdata1和frm和ibd檔案拷貝到當前的mysql資料目錄下,進行覆蓋。注意因為當前資料庫可能還有其它資料庫和表,所以這一步可能導致其它資料庫出現問題。不過沒關係,因為我們已經備份了。

3 保險起見,重啟一下mysql吧,service mysql restart

4 直接登入到zhc_db資料庫,mysql -u root -p zhc_db; 這時候你就可以show tables和select了,激動了吧,看到你的資料了吧。

5 將此資料庫用mysqldump匯出,mysqldump -u root -p[password] zhc_db > dump_zhc_db.sql

好了,你已經有了以前的資料和表定義。

6 最後一步,別忘了,將ibdata1檔案和zhc_db下邊的檔案用之前的備份進行恢復。

7 重啟mysql,然後你就可以將你的資料進行匯入了。注意目錄的許可權一定是MySQL可讀寫的。

Okay,大功告成。

你可以參考:

http://dba.stackexchange.com/questions/16875/mysql-how-to-restore-table-stored-in-a-frm-and-a-ibd-file

作者:hongchangfirst