运维工作中难免会发生一些误操作,当数据库表被误操作删除需要紧急恢复,或者没有备份时,Percona Data Recovery Tool for InnoDB这个工具也已提供一些便捷的恢复。
当然这个工具也有相当的限制:
1、只对innodb表有效
2、一旦发生误操作,需要尽快停止对事故表的写入,将idb文件拷贝出来
3、数据不一定总是能恢复,比如被重新写入的情况等
 
原理简述:
InnoDB的数据都是索引的方式组织的,而且所有的数据都是存储在16KB的数据块中。恢复的过程分几步,分解所有数据文件为单个16KB大小的页面,根据每个页面的标记的数据起点开始尝试匹配,如果与给定表定义的size合适,认为匹配成功,则输出记录。
 
操作步骤:
 
一、安装编译:
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
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
...
 
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# make
...
 
二、实验数据:
mysql> create table luna (id int,name varchar(10),sex varchar(2),logtime date);
Query OK, 0 rows affected (0.10 sec)
 
mysql> insert into luna values(1,'kuja','m','1986-01-19');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into luna values(2,'ben','m','1986-01-19');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into luna values(3,'lulu','m','1986-01-19');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from luna;
+------+------+------+------------+
| id   | name | sex  | logtime    |
+------+------+------+------------+
|    1 | kuja | m    | 1986-01-19 |
|    2 | ben  | m    | 1986-01-19 |
|    3 | lulu | m    | 1986-01-19 |
+------+------+------+------------+
3 rows in set (0.00 sec)
 
mysql> delete from luna;
Query OK, 3 rows affected (0.00 sec)
 
三、备份出要恢复表的idb文件并解析:
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# cp /usr/local/mysql/data/test/luna.ibd /app/qipai_data/kuja/percona/percona-data-recovery-tool-for-innodb-0.5
 
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# ./page_parser -5 -f luna.ibd
Opening file: luna.ibd:
64768           ID of device containing file
12419559                inode number
33184           protection
1               number of hard links
0               user ID of owner
0               group ID of owner
0               device ID (if special file)
98304           total size, in bytes
4096            blocksize for filesystem I/O
200             number of blocks allocated
1397468556      time of last access
1397468556      time of last modification
1397468590      time of last status change
98304   Size to process in bytes
104857600       Disk cache size in bytes
 
生成目录:
drwxr-xr-x  3 root root     4096 Apr 14 17:43 pages-1397468622
 
四、生成表定义:
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# ./create_defs.pl --user=kuja --password=kuja --host=192.168.13.21  --db=test --table=luna >include/table_defs.h
 
[root@zabbix 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 -c tables_dict.c -o lib/tables_dict.o
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 -c print_data.c -o lib/print_data.o
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 -c check_data.c -o lib/check_data.o
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 -o constraints_parser constraints_parser.c lib/tables_dict.o lib/print_data.o lib/check_data.o lib/libut.a lib/libmystrings.a
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
 
五、将数据导入sql文件
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# ./constraints_parser -5 -D -f pages-1397468622/FIL_PAGE_INDEX/0-13394/0-00000003.page > /tmp/111.sql
LOAD DATA INFILE '/app/qipai_data/kuja/percona/percona-data-recovery-tool-for-innodb-0.5/dumps/default/luna' REPLACE INTO TABLE `luna` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'luna\t' (id, name, sex, logtime);
 
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# more /tmp/111.sql
luna    1       "kuja"  "m"     "1986-01-19"
luna    2       "ben"   "m"     "1986-01-19"
luna    3       "lulu"  "m"     "1986-01-19"
 
至此得到数据恢复文本。
 
六、附加参数释义:
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# ./constraints_parser -h
Error: Usage: ./constraints_parser -4|-5 [-dDV] -f <InnoDB page or dir> [-T N:M] [-b <extrenal pages directory>]
 Where
   -f <InnoDB page(s)> -- InnoDB page or directory with pages
   -h  -- Print this help
   -d  -- Process only those pages which potentially could have deleted records (default = NO)
   -D  -- Recover deleted rows only (default = NO)
   -U  -- Recover UNdeleted rows only (default = NO)
   -V  -- Verbode mode (lots of debug information)
   -4  -- innodb_datafile is in REDUNDANT format
   -5  -- innodb_datafile is in COMPACT format
   -T  -- retrieves only pages with index id = NM (N - high word, M - low word of id)
   -b <dir> -- Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/
 
七、实验中的碰到的问题:
生成表定义时报错
[root@zabbix percona-data-recovery-tool-for-innodb-0.5]# ./create_defs.pl  --db test --table luna >include/table_defs.h
install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at (eval 3) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: DBM, ExampleP, File, Proxy, Sponge.
at ./create_defs.pl line 37
 
该问题的原因是没有安装perl-DBD-MySQL
 
安装后解决:
[root@zabbix include]# yum install perl-DBD-MySQL
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: centos.ustc.edu.cn
* base: centos.ustc.edu.cn
* extras: centos.ustc.edu.cn
* updates: centos.ustc.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package perl-DBD-MySQL.x86_64 0:3.0007-2.el5 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=====================================================================================================================================================================
Package                                     Arch                                Version                                     Repository                         Size
=====================================================================================================================================================================
Installing:
perl-DBD-MySQL                              x86_64                              3.0007-2.el5                                base                              148 k
 
Transaction Summary
=====================================================================================================================================================================
Install      1 Package(s)        
Update       0 Package(s)        
Remove       0 Package(s)        
 
Total download size: 148 k
Is this ok [y/N]: y
Downloading Packages:
perl-DBD-MySQL-3.0007-2.el5.x86_64.rpm                                                                                                        | 148 kB     00:00    
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
 Installing     : perl-DBD-MySQL                                                                                                                                1/1
 
Installed:
 perl-DBD-MySQL.x86_64 0:3.0007-2.el5                                                                                                                              
 
Complete!

使用Percona Data Recovery Tool for InnoDB恢复数据的更多相关文章

  1. Percona Data Recovery Tool for InnoDB工具恢复单表的案例

    今天上班有个朋友询问我,相关Percona Data Recovery Tool for InnoDB恢复数据中的一些问题,比如说delete,没法恢复数据,原先做过类似的异常处理就,再次模拟了下相关 ...

  2. Percona Data Recovery Tool 单表恢复

    前几天写过update或者delete忘加where条件的数据恢复.今天介绍一款开源的MySQL数据库InnoDB数据恢复工具:innodb-tools,它通过从原始数据文件中提取表的行记录,实现从丢 ...

  3. Android Data Recovery for Mac(安卓数据恢复软件)破解版安装

    1.软件简介    Android Data Recovery 是 macOS 系统上一款 Android 设备数据恢复软件,能够帮助我们在 mac 电脑上对 Android 设备进行数据恢复,文档. ...

  4. VMware Data Recovery备份恢复vmware虚拟机

    VMware Data Recovery 是VMware虚拟机备份工具,可创建虚拟机备份,同时不会中断虚拟机的使用或虚拟机提供的数据和服务.Data Recovery 管理现有备份,并在这些备份过时后 ...

  5. 14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:

    14.18.1 The InnoDB Recovery Process InnoDB 恢复进程: InnoDB crash recovery 有几个步骤组成: 1.应用redo log,Redo lo ...

  6. DRA(Data Recovery Advisor)的使用

    关于DRA的官方描述: The simplest way to diagnose and repair database problems is to use the Data Recovery Ad ...

  7. 转:主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Undelete 360

    转自:Baidu 空间 2012-10-05 13:57 主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Und ...

  8. 小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复

    1.安装软件仓库(不要问我为什么不用源码安装,好吧,其实我懒.) 1 2 3 4 5 6 7 8 wget https://www.percona.com/downloads/percona-rele ...

  9. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

随机推荐

  1. 记录下mainfest.json 原生标题的按钮监听

    首先在mainfest.json中 plus下添加以下代码 "launchwebview": {"titleNView": {"backgroundc ...

  2. LODOP整页缩放,宽度、高度溢出缩放

    LODOP中,超文本超过打印项高度会自动分页,可以用语句进行缩放,让打印内容都在一页中.例如,整页缩放和高度溢出缩放.如下是三个语句及其效果,注意对内容缩放可能会导致变形哦,毕竟是不等比例缩放:LOD ...

  3. C#操作session的类实例(转)

    using System.Web; namespace DotNet.Utilities { public static class SessionHelper2 { /// <summary& ...

  4. Spring MVC 使用介绍(八)—— 类型转换

    一.概述 spring类型转换有两种方式: PropertyEditor:可实现String<--->Object 之间相互转换 Converter:可实现任意类型的相互转换 类型转换的过 ...

  5. JS类型

    1.查看类型 可以使用 typeof 操作符来检测变量的数据类型. typeof "John" // 返回 string typeof 3.14 // 返回 number type ...

  6. JPA的merge对联合唯一索引无效(代码库)

    问题 JPA的merge()操作 是合并的意思,就是当保存的实体时,根据主键id划分,如果已存在,那么就是更新操作,如果不存在,就是新增操作 但是这个仅针对 主键id 划分,对联合唯一索引 无效,两次 ...

  7. P1494 [国家集训队]小Z的袜子

    题目 P1494 [国家集训队]小Z的袜子 解析 在区间\([l,r]\)内, 任选两只袜子,有 \[r-l+1\choose2\] \[=\frac{(r-l+1)!}{2!(r-l-1)!}\] ...

  8. CSS实现动画特效导航栏

    0 写在前面 今天用纯CSS编写了一种带有特效的导航栏,一方面巩固熟悉了导航栏的一般写法,另一方面练习了CSS3的一些新特性. 1 实现效果 当鼠标划过时,实现了一种动态百叶窗效果. 2 实现细节 2 ...

  9. python中xrange和range(转)

    说到序列,我们第一想到的是一组有序元素组成的集合.同时,每个元素都有唯一的下标作为索引. 在Python中,有许多内界的序列.包括元组tuple,列表list,字符串str等.上面提到的序列类型(li ...

  10. CodeForces 70

    题目 A题 #include<bits/stdc++.h> using namespace std; int n,b,sum; int main(){ scanf("%d&quo ...