Mysql ibd恢復(delete 數據)


轉載:https://www.linuxidc.com/Linux/2017-05/143870.htm

首先呢,請各位注意Percona Data Recovery Tool for InnoDB工具的適用范圍:
1)本次應用的恢復工具僅適用與innodb存儲引擎,Myisam不支持
2)Truncate tabe 不能恢復
3)Drop table 想也別想了
恢復原理:
對於INNODB存儲引擎而言,DELETE操作,不是真正刪除物理文件上的行,而是給刪除的行添加了一個刪除的標記,我們利用此工具找到那些標注了刪除標記的行,然后將其存放到一個文本中去,最后通過load data恢復數據;而truncate操作,是直接將數據行清空,並非添加刪除標記(查看物理文件,執行truncate的表的ibd文件會縮小,而執行了DELETE的表,甚至比之前大)
 
正文開始:

下載:percona-data-recovery-tool-for-innodb-0.5.tar.gz
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

安裝 yum -y install ncurses-devel.x86_64
安裝 yum install glibc-static
安裝 yum install -y mariadb-server
    開啟:systemctl start mariadb.service
    開機啟動:systemctl enable mariadb.service
安裝 yum -y install perl-DBD-MySQL.x86_64 (如果沒有mysql)
    開啟:service mysql start

安裝編譯
tar xvf percona-data-recovery-tool-for-innodb-0.5.tar.gz

[root@zabbix percona]# cd percona-data-recovery-tool-for-innodb-0.5

[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# cd mysql-source/

[root@zabbix mysql-source]# ./configure

[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# make

右鍵屬性查看 ibd所在路徑 。我的是/root/mysql/xxxx.ibd
執行
[root@dns1 percona-data-recovery-tool-for-innodb-0.5]# ./page_parser -5 -f /var/lib/mysql/test/site_ksteam.ibd
[root@dns1 percona-data-recovery-tool-for-innodb-0.5]# ls
check_data.c          create_defs.pl  ibdconnect    incrementalupdate.c  INSTALL  mysql-source  pages-1494339302  split_dump.pl
constraints_parser    docs            ibdconnect.c  innochecksum        lib      page_parser    pages-1494339674  tables_dict.c


[root@dns1 percona-data-recovery-tool-for-innodb-0.5]# ls pages-1494339302/FIL_PAGE_INDEX/
0-2475  0-2476  0-2477


在FIL_PAGE_INDEX目錄下會生成主鍵和索引,數據最小的是主鍵,后面的依次是每個列的索引,如0-2475是site_ksteam表的主鍵,0-2476是表的索引
2)生成site_ksteam表的表結構:

(沒有密碼就去掉--password)

(沒有表結構,就要先創建表結構,表名字段都一樣)

[root@dns1percona-data-recovery-tool-for-innodb-0.5]# ./create_defs.pl --host localhost --port 3306 --user root --password 123456 --db test --table site_ksteam > include/table_defs.h  正常情況下沒有任何的報錯

3)還得再次執行make命令

[root@dns1 percona-data-recovery-tool-for-innodb-0.5]# make
gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -Wall -O3 -g -I include -I mysql-source/include -I mysql-source/innobase/include -static -lrt -o page_parser page_parser.c lib/tables_dict.o lib/libut.a
最后是這條信息,就是正常的

4)將查找到的數據保存到/tmp/site_ksteam.txt文件

(不知道選哪個pages,那就去percona-data-recovery-tool-for-innodb-0.5​​​​​​​ 看pages的時間,選最后一個)

(最后全部完成后,可以把pages刪除掉)

[root@dns1percona-data-recovery-tool-for-innodb-0.5]# ./constraints_parser -D -5 -f pages-1494339674/FIL_PAGE_INDEX/0-2351/ > /tmp/site_ksteam.txt  -D 恢復刪除的行;-5表的文件格式,默認Compact;
-f 指定site_ksteam表的主鍵目錄
LOAD DATA INFILE '/com/percona-data-recovery-tool-for-innodb-0.5/dumps/default/site_ksteam' REPLACE INTO TABLE `site_ksteam` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'site_ksteam\t' (id, catid, typeid, title, style, thumb, keywords, description, posids, url, listorder, status, sysadd, islink, username, inputtime, updatetime, contact, titles, level, cimage, bimage, language, subject);

5)連接Mysql,將數據導入表中

(報錯:Can't get stat of ....errCode 2  則使用:LOAD DATA LOCAL INFILE)
mysql> LOAD DATA INFILE '/tmp/site_ksteam.txt' REPLACE INTO TABLE `site_ksteam` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'site_ksteam\t' (id, catid, typeid, title, style, thumb, keywords, description, posids, url, listorder, status, sysadd, islink, username, inputtime, updatetime, contact, titles, level, cimage, bimage, language, subject);

6) mariadb 導出數據到sql

1,mysqldump -u 用戶名 -p 密碼 database > xxx.sql

2,sql去執行就行了。

最后呢,還是想吐槽下,開始搞這個工具的時候,網上的資料,呵呵,人雲亦雲的,也不說中間可能遇到啥問題,怎么解決,最最重要的是, 此工具對在線運行的數據庫進行恢復操作,會出現數據丟失現象!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM