一个技术博客

通过.ibd文件恢复Innodb单表数据 percona-data-recovery-tool-for-innodb使用

本文由 Tim 于 2016-04-14 18:54:49 发表

使用共享表空间存储方式时,Innodb的所有数据保存在一个单独的表空间里面(ibdata)innodb-file-per-table = 1 表示设置每个表单独存放, 现在innodb默认为1,在innodb-file-per-table = 1的时候Mysql Innodb表物理文件由.frm和.ibd文件组成,.frm存放表结构,元数据; .ibd文件存放的是表数据,Mysql数据目录下ibdata 是共享表空间,存放Innodb表的一些信息比如space id、index id,还有未提交的undo页等

ib_logfile* 是事务日志或称redo日志,数据库crash时用于恢复

mysql-bin*,bin* 存放的是二进制日志,可以用来point-in-time 恢复(需要设置log-bin)

网上有很多文档写了使用.frm恢复表结构,但楼主实测并不能单独使用.frm恢复innodb的表结构,只能在有ibdata文件的情况下,恢复表结构,也就是冷备。

单独使用.frm恢复innodb的表结构先留空,等以后看到好方法了再补上。

使用.ibd文件恢复表数据

一、使用alter table tablename discard/import tablespace,相当于重新建立关系,较简单

本文测试使用的user.ibd下载

现在有一个user.ibd 文件,表结构为

新建一个数据库(测试环境上)

使用如上user建表语句建表;之后进入相应文件夹可以看到user.ibd文件

有兴趣的小伙伴可以用16进制查看user.ibd文件0000024-25和0000028-29内的数据,我的是0006,如红框内,这个是innodb表的id

通过.ibd文件恢复Innodb单表数据 percona-data-recovery-tool-for-innodb使用

进入mysql将user表的表空间废弃

此时数据目录下没有了user.ibd

然后将要还原的.ibd文件拷贝到该目录下,并更改文件属主

可以看下需要还原user.ibd中的表id,可以看到为0027

通过.ibd文件恢复Innodb单表数据 percona-data-recovery-tool-for-innodb使用

 

现在我们进入mysql,导入表数据,有一条警告信息不是本文重点,读者可自行研究

至此表还原成功

此时可以在看user.ibd中的表id,发现变成了0006,与最初建表一致。

通过.ibd文件恢复Innodb单表数据 percona-data-recovery-tool-for-innodb使用

 

vi中查看16进制使用    :%!xxd 查看,安装xxd  yum -y install vim-common

 

此方法亲测在Mysql5.6,5.7上均可成功,如跨版本,须使表的行格式一致,否则会报错,查看innodb表行格式可以使用show table status like ‘user’;

 

二、使用percona-data-recovery-tool-for-innodb 恢复.ibd 文件

在某些情况下上面的可能恢复不了,这个时候可以用到这个工具,percona-data-recovery-tool-for-innodb用来从InnoDB的数据文件(即.ibd)恢复丢失或损坏的数据,由Mysql三大分支之一的Percona的创建并开源。

1、安装percona-data-recovery-tool-for-innodb

percona-data-recovery-tool-for-innodb下载

也可以使用wget下载percona-data-recovery-tool-for-innodb-0.5/mysql-source目录

安装依赖包,否则在./configure 和  ./create_defs.pl 步骤会报错,perl包会比较多

解压并进入

在mysql-source执行

configure完后到上层目录percona-data-recovery-tool-for-innodb-0.5/下make

percona-data-recovery-tool-for-innodb  安装完成

安装参考文档http://blog.itpub.net/22664653/viewspace-771993/

2、percona-data-recovery-tool-for-innodb恢复.ibd数据

本文测试使用的user.ibd下载

现在我们有了安装好的恢复软件,和一个需要恢复的.ibd文件,剩下就是恢复了

(1)首先依然是创建数据库和表结构,此时表内数据为空

(2)使用percona-data-recovery-tool-for-innodb分解.ibd数据页

可以看到类似信息,最后在目录下生产一个类似pages-1460629302的目录 这里面就是从.ibd文件分解的innodb页

(3)获取表结构在,percona-data-recovery-tool-for-innodb-0.5/目录下执行,需要能连接的数据库

执行成功后

有兴趣的同学可以查看下table_defs.h文件,可以看到相应字段信息

获得表结构后返回percona-data-recovery-tool-for-innodb-0.5/目录下执行make

执行 ./constraints_parser  -5 -f pages-1460629302/FIL_PAGE_INDEX/0-63/ > /tmp/user.txt
首先可以看下帮助

如果用来还原删除可以加-D,-5 是compact行格式,-f 页文件,需要恢复全部数据,pages-1460629302,因此执行命令:

pages-1460629302/FIL_PAGE_INDEX/0-63/ 读者可以自行进目录查看0-x,不同的.ibd大小是不一样的

会生成/tmp/user.txt 文件和一条命令

查看文件内容,已经可以看到数据,成功提取数据了

之后将./constraints_parser步骤产生load file命令中,路径替换成/tmp/user.txt后在mysql执行

成功还原数据

参考文档https://www.percona.com/blog/2012/02/20/how-to-recover-deleted-rows-from-an-innodb-tablespace/

本文仅抛砖引玉,如果你有更好的方法或发现本文存在纰漏欢迎在评论区回复

引申阅读(以上操作建议在测试环境中尝试,尝试前可先冷备,如有问题用冷备文件覆盖还原,这样就可以重复尝试)

MySQL:如何从ibd文件中恢复数据 http://blog.csdn.net/ylqmf/article/details/7229562
Innodb单表数据物理恢复 http://cenalulu.github.io/mysql/innodb-single-tablespace-recovery/
frm+ibd文件还原data http://my.oschina.net/sansom/blog/179116?fromerr=tWcPc1bf

注:以上链接有部分楼主进行尝试并不能成功,甚至还有按教程损坏ibdata1的情况,因此读者可自行尝试

 

 

欢迎转载,转载请注明出处!Tim » 通过.ibd文件恢复Innodb单表数据 percona-data-recovery-tool-for-innodb使用

点赞 (1)or拍砖 (0)
分享到:更多 ()