Mysql 經過frm&ibd 恢復數據

mysql存儲在磁盤中,各類天災人禍都會致使數據丟失。大公司的時候咱們經常須要作好數據冷熱備,對於小公司來講要作好全部數據備份須要支出大量的成本,不少公司也是不現實的。萬一尚未作好備份,數據被誤刪除了,或者ibdata損壞了怎麼辦呢?別擔憂,只要有部分的frm、ibd存在就能夠恢復部分數據。mysql

注意:sql

1、這個是對innodb的數據恢復。myisam不須要這麼麻煩,只要數據文件存在直接複製過去就能夠。數據庫

2、你們的mysql數據庫必須是按表存放數據的,默認不是,可是你們生產確定是按分表設置的吧,若是不是,很差意思,這個方法不能恢復你的數據。日誌

      my.ini的設置爲 innodb_file_per_table = 1。innodb

一、找回表結構,若是表結構沒有丟失直接到下一步table

a、先建立一個數據庫,這個數據庫必須是沒有表和任何操做的。file

b、建立一個表結構,和要恢復的表名是同樣的。表裏的字段無所謂。service

 必定要是innodb引擎的。CREATE TABLE `ax_table`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;方法

c、關閉mysql, service mysqld stop; 數據

d、用須要恢復的frm文件覆蓋剛新建的frm文件;

e、修改my.ini 裏 innodb_force_recovery=1 , 若是不成修改成 2,3,4,5,6。

f、 啓動mysql,service mysqld start;show create table ax_table 就能看到表結構信息了。

二、找回數據。記得上面把 innodb_force_recovery改掉了,須要註釋掉,否則恢復模式很差操做。

  這裏有個關鍵的問題,就是innodb裏的任何數據操做都是一個日誌的記錄點。

  也就是若是咱們須要數據恢復,必須把以前的表的數據的日誌記錄點添加到一致。

a、創建一個數據庫,根據上面導出的建立表的sql執行建立表。

b、找到記錄點。先要把當前數據庫的表空間廢棄掉,使當前ibd的數據文件和frm分離。 ALTER TABLE ax_table DISCARD TABLESPACE;

c、把以前要恢復的 .ibd文件複製到新的表結構文件夾下。 使當前的ibd 和frm發生關係。ALTER TABLE ax_table IMPORT TABLESPACE;  

這個時候沒有錯誤,說明已經創建好了。若是能查到數據,到此就OK了,若是不行,請執行以下操做。

d、相比這裏你們已經知道爲何了,這個模式也不是說改了數據庫就能夠在生產環境使用。更改 innodb_force_recovery=1 , 若是不成修改成 2,3,4,5,6。直到能夠 查詢出數據爲止,而後dump出來。數據就備份出來了。

e、把全部數據導出後,在新的數據庫導入。全部數據就生成了。  

相關文章
相關標籤/搜索