1. 程式人生 > >讓天下沒有難用的資料庫 » 使用Percona Data Recovery Tool for InnoDB恢復資料

讓天下沒有難用的資料庫 » 使用Percona Data Recovery Tool for InnoDB恢復資料

昨晚收到一則求助,一個使用者的本地資料庫的重要資料由於誤操作被刪除,需要進行緊急恢復,使用者的資料庫日常並沒有進行過任何備份,binlog也沒有開啟,所以從備份和binlog入手已經成為不可能,諮詢了丁奇,發了一篇percona的文章給我,頓時感覺有希望,於是到percona的官網上下載了恢復工具
一.安裝:
.tar -xvf percona-data-recovery-tool-for-innodb-0.5.tar.gz
.cd percona-data-recovery-tool-for-innodb-0/mysql-source/
../configure
.cd percona-data-recovery-tool-for-innodb-0
.make

二.解析ibd檔案:
此過程會將表的idb檔案解析為很多的page,innodb的page分為兩大部分,一部分一級索引部分(primary key),另一部分為二級索引部分(secondary key),所以解析出來的idb包括了主鍵資料和索引資料兩大部分(如果該表有多個二級索引,則會生成多個檔案)
./page_parser -5 -f t_bibasic_storage.ibd
引數解釋:
-5:代表 row format為Compact
-f:代表要解析的檔案
結果如下:
pages-1377707810/FIL_PAGE_INDEX
0-161 0-325 0-463 0-464 0-465
可以看到t_bibasic_storage.ibd解析出來5個檔案(161為主鍵索引的index_id,325,463,464,465為二級索引的index_id,該id可以通過開啟innodb_table_monitor知曉)

三.生成表定義:
由於該工具在解析資料pages的時候,需要獲得該table的表結構定義,所以需要執行如下命令:
./create_defs.pl –host xxxx –port 3306 –user root –password xxx –db didb –table t_bibasic_storage >include/table_defs.h
上面的命令會將t_bibasic_storage表的表結構定義傳入到table_defs.h中,在生成了表結構定義後,重新make該恢復工具:
.make

四.開始恢復pages中刪除的資料:
在重新編譯工具後,執行如下命令:
./constraints_parser -5 -D -f pages-1377707810/FIL_PAGE_INDEX/0-161 >/tmp/t_bibasic_salessend.sql
引數:
-5 -f的引數和page_parser相同;
-D:該引數的含義為代表恢復刪除的資料頁;

恢復完成後生成如下語句和檔案:
LOAD DATA INFILE ‘/tmp/t_bibasic_proinfo.dmp’ REPLACE INTO TABLE `t_bibasic_proinfo` FIELDS TERMINATED BY ‘\t’ OPTIONALLY ENCLOSED BY ‘”‘ LINES STARTING BY ‘t_bibasic_proinfo\t’ (id, procode, skuoid, skucode, skuname, catatt, dutydepoid, dutydepname, seasonatt, brandatt, prostatus, choosedate, syear, smonth, sday, created, unioncomcode);

/tmp/t_bibasic_salessend.sql 該檔案就是我們需要load data的文字檔案;

總結:
1)。該恢復工具只支援innodb儲存引擎,檔案的格式需要為:Compact
2)。資料被誤刪除後,需要儘快將保護現場,停止資料庫,把idb檔案拷貝出來,防止ibd檔案寫入資料被覆蓋(筆者恢復的一個表中,由於資料刪除後,表中仍有大量寫入,導致大部分資料沒有恢復出來);
3)。千叮囑萬囑咐,資料庫的備份重於泰山;