【实操】MySQL 通过idb文件恢复Innodb数据

Home / Article MrLee 11月前 822

朋友在测试服务器上面搞重要数据,结果被我当成垃圾数据删除了,最后哭着说这是很重要的数据……

行吧,废话不多说了。

需要工具Percona Data Recovery Tool for InnoDB

在centos系统下进行

恢复原理:
对于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

安装编译

tar xvf percona-data-recovery-tool-for-innodb-0.5.tar.gz
cd percona-data-recovery-tool-for-innodb-0.5/mysql-source
./configure
cd ..
make

##解析ibd文件文件,以下路径仅供参考

./page_parser -5 -f /var/lib/mysql/库名/表名.idb

然后就生成以下文件结构

/home/percona-data-recovery-tool-for-innodb-0.5/pages-1634717249/FIL_PAGE_INDEX/0-245/

./create_defs.pl --host localhost --port 3306 --user root --password 1213520 --db dbname --table tablename > include/table_defs.h

如果没错,恭喜你!不过我这个过程中,出现symbol mysql_init, version libmysqlclient_18 not defined in file libmysqlclient的错误,后来从我另外一台服务器相同位置复制了一份到朋友服务器上,才通过。期间我也把以上步骤在我自己服务器上操作,倒是没出现这个symbol mysql_init, version libmysqlclient_18 not defined in file 错误,但是生成头文件是0KB,没有内容。不知道是不是数据库对应版本的关系。

重新再make一次,记得是在percona-data-recovery-tool-for-innodb-0.5/根目录并解析数据

make
./constraints_parser -D -5 -f /home/percona-data-recovery-tool-for-innodb-0.5/pages-1634717249/FIL_PAGE_INDEX/0-245/ > /tmp/test.txt

执行结果是一串导入数据的mysql语句,记得保存这里我引用网上的。

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);

最后这里基本上就是成功了,但是我用这个命令行老是不成功,报ERROR 13 (HY000): Can't get stat 错误,没有找到文件,我授权了路径也是/tmp下面生成的test.txt文件,不知道为啥。最后放到前面的idb目录下,居然成功了。功能是没有那个目录的权限。

/var/lib/mysql/库名/test.txt

简单的东西,搞了3个小时。万幸的是最终还是成功了!!!

本文链接:https://www.it72.com/12698.htm

上传的附件:
推荐阅读
最新回复 (0)
返回