使用的工具是percona-data-recovery-tool-for-innodb-0.5.tar.gz,测试的操作是delete from a;
然后将表里的数据恢复出来。虽然没有全部恢复,但是大部分有了。也就是说,我没有能全部恢复。
1.出现误删除后,尽快停掉mysql,然后拷贝删除表的ibd文件。然后再次启动mysql。
如果没有配置innodb_file_per_table,那就需要将ibdata1这个文件拿去恢复了。
After the “accidental” deletion of rows you should stop MySQL, take a copy of the salaries.ibd and start it again.
2.查询表信息。
对于误删的表可以通过查询表信息,确认row_format和index信息。目的就是为了确认在使用page_parser命令的时候确定参数。
查询row_format信息:
登陆到mysql里查询误删除表的信息
如果informatino_schema这个库中,有innodb_sys的相关表,就可以直接查询出表的row_format以及index_id name
#database_name 就是数据库名,table_name是库里的表名,就是你误删除的那个库和那个表。
select i.index_id,i.name,t.row_format from information_schema.innodb_sys_indexes as i inner join information_schema.innodb_sys_tables as t USING(TABLE_ID) where t.name='"${database_name}/""${table_name}"'"
样例如下:
如果没有这些表,可以查询tables表获取一些信息,剩下的就是自己根据情况判断了。
3.获取了以上信息以后,就需要通过page_parser来导出page信息了
假设,拷贝出来的表叫a,文件就是a.ibd.
./page_parser -5 -f a.ibd
#这里的5表示row_format是Compact格式。
The row format can be -4 (REDUNDANT) or -5 (COMPACT). From 5.0.3 the default format is COMPACT.
当执行完毕后,会在当前目录生成一个pages-xxxxxxx的目录。这个目录里就是包含了导出的page信息。
例如:
pages-1489137771/FIL_PAGE_INDEX/
在这个目录下会有不同的目录,按上图的话就是0-2302,0-2303,0-2304。因为我们提前查询了index_id,所以知道 0-2302是PRIMARY,也就是起始的文件。我们一会就要使用这个文件来恢复。
4.通过perl脚本获取表信息,并创建数据恢复程序使用的表结构。
./create_defs.pl --host 127.0.0.1 --port 3306 --user root --password xxxxx --db testaaa --table a >include/table_defs.h
include目录是解开工具包里自己就有的。直接按照命令输出到table_defs.h即可。
5.这一步是需要重新编译
make
完成这个步骤以后,会重新生成文件 constraints_parser,这个文件只适用于本次恢复的这个表。
6.恢复数据
./constraints_parser -5 -D -f pages-1489137771/FIL_PAGE_INDEX/0-2302/ >a.recovery
解释一下:
这个命令的参数5上边说过了,就是mysql的row_format格式。-D表示的只恢复程序认为已经删除的,-f表示需要读取的目录。最后是将能恢复的输出到以为文件,CSV格式的。
上边这个命令是从别的地方看到的。我实际实验的时候使用的是下边的命令
./constraints_parser -5 -f pages-1489137771/FIL_PAGE_INDEX/0-2302/ >a.recovery
也就是将所有记录全部导出来。
7.导入表中。
登陆到mysql中,使用以下命令导入表中。
load data infile 'a.recovery' replace into table `a` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'a\t' (id,username,testfield1,test3);
读取a.recovery文件导入到表a中,csv格式同时以'a’开头,后边括号里是字段名称。
具体根据需要修改。最好是查看以下恢复的文件。