無全量備份、未開啓binlog日誌,利用percona工具恢復delete的數據

當我們忘記做全量備份時,並且沒有開啓binlog,並執行了

delete from sbtest;

數據全部丟失,要想恢復是很有難度的。


今天,利用Percona Data Recovery Tool for InnoDB工具(僅支持InnoDB,MyISAM不支持),可以找回被刪除的數據。


原理:在InnoDB引擎,delete刪除操作,不是真正的刪除物理文件上的行,而是增加一個刪除的標記,我們都用過WORD吧?在修改字體的時候,有一個刪除線的標記,如《MySQL 管理之道》,該工具利用這個特性,找回那些標註了刪除線的數據,並存入到一個文本里,然後通過load data命令,批量插入到表裏。


注:truncate不能恢復(truncate是直接清空數據行,並不是添加刪除標記,你可以通過查看物理文件,執行了truncate操作,ibd文件變小,而執行了delete操作,ibd文件還跟之前的一樣大),drop不能恢復(數據文件都沒了,還怎麼恢復?)。


一、安裝Percona Data Recovery Tool for InnoDB工具

# 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

# cd percona-data-recovery-tool-for-innodb-0.5/mysql-source
# ./configure
# cd ..
# make

二、全表刪除sbtest表

delete from sbtest;

三、恢復

1、提取ibd物理文件,按照每頁16K,單獨存放。

# cd percona-data-recovery-tool-for-innodb-0.5/
# ./page_parser -5 -f /usr/local/mysql-5.5.37/data/test/sbtest.ibd

wKioL1QWjBbQtR24AAcTs4jETjo710.jpg

wKioL1QWjBfQ5v4eAAMOU75u5yE417.jpg


會在當前目錄生成一個pages-1410414511目錄(後面的數字是變化的,在你的機器上會跟我的不同)

wKioL1QWjNeRc1gzAAGi--J2QzM705.jpg

wKiom1QWjUXSIuLRAAjqU2V4Rmk266.jpg


在FIL_PAGE_INDEX目錄下面,會生成主鍵和索引,數據最小的是主鍵,後面依次是每個列的索引

wKioL1QWjcfTyYIVAACR8hnJJ78355.jpg

在這裏,0-28是sbtest表的主鍵(id),0-29是sbtest表的索引(k)。記住這個目錄數字,後面我們需要通過這個目錄恢復數據。


2、生成表結構

# cd percona-data-recovery-tool-for-innodb-0.5/
# ./create_defs.pl --host localhost --port 3306 --user root --password 123456 --db test --table sbtest > include/table_defs.h

-- host 主機地址

-- port 端口

-- user 用戶名

-- password 密碼

-- db 數據庫名

-- table 表名


3、再次執行make編譯命令

# cd percona-data-recovery-tool-for-innodb-0.5/
# make

wKiom1QWj3nzmDC0AAUbkA6b0jc746.jpg


4、恢復刪除的數據

# cd percona-data-recovery-tool-for-innodb-0.5/
# ./constraints_parser -D -5 -f pages-1410414511/FIL_PAGE_INDEX/0-28/ > /tmp/sbtest.txt

-D 恢復刪除的行

-5 表的文件格式,默認是Compact

(不清楚的朋友,可以用show table status命令查看)

wKioL1QWkRiDTihIAAI9NJg8fOQ199.jpg

-f 指定生成sbtest表的主鍵目錄


執行完畢,如下圖:

wKiom1QWknDBeZOHAAIWMrwbsBE715.jpg

會自動生成一個load data infile命令,請把這個複製下來,一會我們要導入數據。


在/tmp目錄下,會生成sbtest.txt,我們就要用這個文件做恢復。

wKioL1QWkuHwSGz6AARoxsVwT9s990.jpg



5、導入到表裏

LOAD DATA INFILE '/tmp/sbtest.txt' REPLACE INTO TABLE `sbtest` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'sbtest\t' (id, k, c, pad);

wKioL1QWk57TtLghAAFSBQvfbic614.jpg


總結:

通過上述方法,順利的完成了delete數據恢復。在數據被刪除後,切記要備份ibd數據文件,一定不要覆蓋,否則都是不能完成修復的。目前該工具不支持字符串set類型。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章