MySQL資料庫InnoDB資料恢復工具使用總結
本文從實際使用經驗出發,介紹一款開源的MySQL資料庫InnoDB資料恢復工具:innodb-tools,它通過從原始資料檔案中提取表的行記錄,實現從丟失的或者被毀壞的MySQL表中恢復資料。例如,當你不小心執行DROP TABLE、TRUNCATE TABLE或者DROP DATABASE之後,可以通過以下方式恢復資料。
以下內容大部分參考自:Percona Data Recovery Tool for InnoDB,文件是英文的,而且寫的比較晦澀,這裡是個人的實戰經驗總結,供大家參考學習。
在介紹innodb-tools工具進行資料恢復之前,首先明確以下幾點:
1、這個工具只能對InnoDB/XtraDB表有效,而無法恢復MyISAM表(注: Percona號稱有一套用於恢復MyISAM表的工具,但是本人未做嘗試)。
2、這個工具是以儲存的MySQL資料檔案進行恢復的,而不用MySQL Server執行。
3、不能保證資料總一定可被恢復。例如,被重寫的資料不能被恢復,這種情況下可能需要針對系統或物理的方式來恢復,不屬於本工具的範疇。
4、恢復的最好時機是當你發現數據丟失時,儘快備份MySQL資料檔案。
5、使用這個工具需要手動做一些工作,並不是全自動完成的。
6、恢復過程依賴於你對丟失資料的瞭解程度,在恢復過程中可能需要在不同版本的資料之間做出選擇。那麼如果你越瞭解自己的資料,恢復的可能性就越大。
接下來,下面通過一個例子來介紹如何通過這個工具進行恢復。
1. 前提條件
首先,需要理解的是innodb-tools工具不是通過連線到線上的database進行資料恢復,而是通過離線拷貝資料的方式進行的。注意:不要在MySQL執行的時候,直接拷貝InnoDB檔案,這樣是不安全的,會影響資料恢復過程。
為了完成資料恢復,必須知道將要被恢復的表結構(列名、資料型別)。最簡單的方式就是SHOW CREATE TABLE,當然後續會介紹幾種可替代的方式。因此,如果有一個MySQL server作為備份,即使資料是很早的甚至表中沒有記錄,可以有助於使用innodb-tools工具進行恢復。不過這個不是必須的。
2. 簡單例子
mysql> TRUNCATE TABLE customer;
3. 構建工具
為了構建innodb-tools工具,需要依賴於C編譯器、make工具等。
1、下載解壓innodb-tools工具原始碼:
1 2 |
wget
https: //launchpad .net /percona-data-recovery-tool-for-innodb/trunk/release-0 .5/+download /percona-data-recovery-tool-for-innodb-0 .5. tar .gz
tar
-zxvf percona-data-recovery-tool- for -innodb-0.5. tar .gz
|
2、進入解壓後根目錄下的mysql-source
目錄,執行配置命令(注:不執行make命令):
1 2 |
cd
percona-data-recovery-tool- for -innodb-0.5 /mysql-source
. /configure
|
3、完成配置步驟後,回到解壓後的根目錄,執行make命令,編譯生成page_parser
和constraints_parser工具
:
1 2 |
cd
..
make
|
page_parser工具將根據InnoDB的底層實現原理,解析表的頁和行結構。constraints_parser工具暫時不使用,後續還需要在定義表結構之後,重新編譯生成它。
如果編譯過程中出現問題,點選這裡。本文使用過程中沒有出現問題,故不再一一列舉。
4. 提取需要的頁
InnoDB頁的預設大小是16K,每個頁屬於一個特定表中的一個特定的index。page_parser工具通過讀取資料檔案,根據頁頭中的index ID,拷貝每個頁到一個單獨的檔案中。
如果你的MySQL server被配置為innodb_file_per_table=1
,那麼系統已經幫你實現上述過程。所有需要的頁都在.ibd檔案,而且通常你不需要再切分它。然而,如果.ibd檔案中可能包含多個index,那麼將頁單獨切分開還是有必要的。如果MySQL server沒有配置innodb_file_per_table
,那麼資料會被儲存在一個全域性的表名稱空間(通常是一個名為ibdata1的檔案,本文屬於這種情況),這時候就需要按頁對檔案進行切分。
4.1 切分頁
執行page_parser工具進行切分:
- 如果MySQL是5.0之前的版本,InnoDB採取的是REDUNDANT格式,執行以下命令:
1 |
. /page_parser
-4 -f /path/to/ibdata1
|
- 如果MySQL是5.0版本,InnoDB採取的是COMPACT格式,執行以下命令:
1 |
. /page_parser
-5 -f /path/to/ibdata1
|
執行後,page_parser
工具會建立一個pages-<TIMESTAMP>的目錄,其中TIMESTAMP是UNIX系統時間戳。在這個目錄下,為每個index
ID,以頁的index ID建立一個子目錄。例如:
1 2 |
pages-1330842944 /FIL_PAGE_INDEX/0-1/1-00000008
|