LoginSignup
0
1

More than 5 years have passed since last update.

误删除Innodb mysql后的恢复

Last updated at Posted at 2017-03-10

使用的工具是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}"'"

样例如下:

Kobito.zsUW5X.png

如果没有这些表,可以查询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’开头,后边括号里是字段名称。

具体根据需要修改。最好是查看以下恢复的文件。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1