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