1. 程式人生 > >MySQL innodb引擎下根據.frm和.ibd檔案恢復表結構和資料

MySQL innodb引擎下根據.frm和.ibd檔案恢復表結構和資料

  一次恢復資料庫表結構和資料的實戰,僅以此貼作為記錄。

  由於,前幾天我們使用的資料庫被入侵(順便鄙視一下安全管理人員),資料庫中的表都顯示不存在(僅剩一個黑客自建的----qq_xxxxx的表,但物理檔案都在,例如:.frm、.ibd檔案等)。因此,產生了這次恢復表結構和表資料的實戰。以下開始記述:

  我們對資料庫很多知識都不太瞭解,而像這種恢復資料的工作也沒有做過,因此首先百度了一下.frm和.ibd檔案是做什麼的,見下:

  MySQL中.frm檔案:儲存了每個表的元資料,包括表結構的定義等,該檔案與資料庫引擎無關。

  MySQL中.ibd檔案:InnoDB引擎開啟了獨立表空間(my.ini中配置innodb_file_per_table = 1)產生的存放該表的資料和索引的檔案。

  接著,百度了一下如何用.frm和.ibd檔案恢復資料庫的方法。

  1、首先,恢復資料庫表結構,以我本地資料庫中t_user表為例,其結構如下:

CREATE TABLE `t_user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `create_date` DATETIME NULL DEFAULT NULL,
    `email` VARCHAR(255) NULL DEFAULT NULL,
    `nickname` VARCHAR(255) NULL DEFAULT NULL,
    `password` VARCHAR(255) NOT NULL,
    `phone` VARCHAR(255) NULL DEFAULT NULL,
    `status` INT(11) NOT NULL,
    `username` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2;

  ①、建立一個新資料庫,然後建立一個和需要恢復的表的引擎相同的同名表(即引擎為InnoDB的t_user表,其結構無所謂,可以只有一個欄位),如下:

  以上,我在新建的mytest資料庫中建立了一個引擎為InnoDB的只有一個欄位a的t_user表。

  ②、使用net stop mysql關閉資料庫服務,然後用需要恢復的t_user.frm覆蓋這個新建的mytest資料庫的t_user表的物理檔案t_user.frm,接著對配置檔案(my.ini)設定innodb_force_recovery = 6,然後使用net start mysql啟動服務,並在控制檯進入mytest庫中,使用desc t_user檢視該表結構,如下:表不存在


  ③,此時,我們檢視../mysql/data下的log檔案,可以看到如下:

  以上,應該是說mytest下t_user只定義了一列,但MySQL中有8列。

  ④,使用net stop mysql停掉服務,然後在配置檔案my.ini中將innodb_force_recovery = 6註釋掉(#或;均可),再net start mysql啟動服務。接著,將mytest下t_user表刪掉(drop掉),再新建一個8列欄位的t_user表,如下:欄位隨意

  ⑤、繼續重複②中的操作,使用desc t_user即可獲取到t_user的表結構(使用mysqldump匯出即可),如下:

  2、用t_user.ibd檔案恢復t_user表的資料

  ①、停掉資料庫服務,將innodb_force_recovery = 6註釋掉,然後啟動資料庫服務(若啟動中出現1067錯誤,可以嘗試刪除data資料夾下ibdata1、ib_logfile0、ib_logfile1即可)並刪除mytest下t_user表,並使用新匯出的表結構建立t_user表,如下:

  ②、由於.ibd檔案含有tablespace id,因此我們將需要恢復資料的t_user.ibd的tablespace id改為新建立的t_user.ibd的tablespace id,如下:使用了winHex

需要恢復資料的t_user.id的tablespace id:

新建立的t_user.ibd的tablespace id:


修改後的帶資料的t_user.ibd如下:


  ③、停掉資料庫服務,使用修改tablespace id的t_user.ibd檔案覆蓋mytest庫下的t_user.ibd檔案,並且將配置檔案中innodb_force_recovery = 6去掉註釋,進入mytest庫內,使用select * from t_user檢視資料,獲取到資料如下:


④使用mysqldump匯出表結構和資料即可。

  至此,一次使用.frm和.ibd檔案恢復資料庫資料的演示結束。

注意:最好重新配置一個空的MySQL來進行恢復操作,這樣不會影響到MySQL下別的資料庫,本例中使用的是MySQL 5.6.24版。