當我們忘記做全量備份時,并且沒有開啟binlog,并執行了deletefromsbtest;數據全部丟失,要想恢復是很有難度的。今天,利用PerconaDataRecoveryToolforInnoDB工
當我們忘記做全量備份時,并且沒有開啟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
二、全表刪除sbtest表
delete from sbtest;三、恢復
1、提取ibd物理文件,按照每頁16K,單獨存放。
在這里,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/ # make4、恢復刪除的數據
# 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命令查看)
總結:
通過上述方法,順利的完成了delete數據恢復。在數據被刪除后,切記要備份ibd數據文件,一定不要覆蓋,否則都是不能完成修復的。目前該工具不支持字符串set類型。
本文出自 “賀春旸的技術專欄” 博客,請務必保留此出處
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com