利用MySQL中InnoDB数据文件中的恢复数据

1. 简述恢复原理
因为文档中较为详细的描述,这里只简单说明。所有InnoDB的数据都是索引的方式组织的,而且所有的数据都是存储在16KB的数据块中。恢复的过程分几步,分解所有数据文件为单个16KB大小的页面,根据每个页面的标记的数据起点开始尝试匹配,如果与给定表定义的size合适,认为匹配成功,则输出记录。

2. 并行的恢复
数据恢复通常是争分夺秒的,PDRTI工具本身是一个基础工具,如果使用该工具做做串行恢复,时间会非常长,通过简单的shell脚本可以让constraints_parser脚本并行工作,这样可以大大缩短数据的恢复时间。根据实际经验,机器稍微好点,实际恢复时间可以缩短到串行的二十分之一。也就是说,原来需要40小时,通过并行可能2个小时就可以了。

以下是两个并行恢复的脚本,供参考:

 代码如下 复制代码

#!/bin/bash
ws=/u01/recovery
pagedir=/u01/recovery/pages-1372436970/FIL_PAGE_INDEX
logdir=/u01/recovery/log
rectool=/u01/recovery/percona-data-recovery-tool-for-innodb-0.5/constraints_parser
cd `dirname $rectool`
count=0
page_count=353894
page_done=0
startdate=`date +%s`
for d1 in `ls $pagedir`
do
  count=$(($count+1))
  echo "in page $d2 at dir $d1" > $logdir/$count.log
  thedate=`date +%s`
  echo "$page_done / $page_count at $thedate from $startdate"
  total=`ls -l $pagedir/$d1/|wc -l`
  page_done=$(($page_done+$total))
  threads=`ps axu|grep parser_jobs|grep -v grep|wc -l`
  echo $threads
  while [ $threads -gt 48 ];
  do
    sleep 1
    threads=`ps axu|grep parser_jobs|grep -v grep|wc -l`
  done
  $ws/parser_jobs.sh $pagedir/$d1 > $ws/job.log 2>&1 &
done#!/bin/bash
pagedir=/u01/recovery/pages-1372436970/FIL_PAGE_INDEX
logdir=/u01/recovery/log
rectool=/u01/recovery/percona-data-recovery-tool-for-innodb-0.5/constraints_parser
logfile="$logdir/`basename $1`.log"
echo "$1" > $logfile
if [ -d $1 ];then
  for d2 in `ls $1`
  do
    $rectool -5 -f $1/$d2 >> $logfile 2>/dev/null
  done
fi

3. 从索引中恢复
如果知道数据表的索引结构,如果数据部分损坏,但是索引部分完整,可以通过这个办法提取出来更多的字段信息。

4. 紧急情况下的问题处理
这次下厨房的技术总结中提到,"第一时间停止MySQL防止硬盘继续写入这个应急措施是错误的",正常如果进程没有被关闭,进程所打开的文件是不会被覆盖的,可以通过从/proc文件系统拷贝的方式恢复出当前仍然打开的文件(参考:Recovering files from /Proc)。如果数据文件和日志文件都能够cp出来,那么有希望让MySQL自己启动,并根据事务日志恢复出当前一致的数据。

时间: 2024-07-29 23:20:33

利用MySQL中InnoDB数据文件中的恢复数据的相关文章

c++的问题-C++中的从文件中读取数据并用链表创建的问题,请帮我看一下我的代码在哪里出现了问题

问题描述 C++中的从文件中读取数据并用链表创建的问题,请帮我看一下我的代码在哪里出现了问题 Phone* creat() { ifstream file("Phone.txt"); if( !file ) { for( int i = 0 ; i < 7; i++ ) cout< cout cout system("pause"); system("cls"); } next=NULL; Phone *pNew,*head,*q;

csv-java中读取CSV文件时怎么处理数据当中的逗号?

问题描述 java中读取CSV文件时怎么处理数据当中的逗号? 现在要读取一个CSV文件,将内容读取后用excel的格式输出, 读取的时候使用StringTokenizer类,用逗号将CSV的数据用逗号一个个分割, csv的格式是这样的(值与值之间用半角逗号分隔): "aaa","bbb","ccc","ddd","eee"; 像这样的情况是没有问题的: 但是当数据中也有半角逗号时,例如: "aaa

matlab中如何提取数据文件中的特定行和列?

问题描述 matlab中如何提取数据文件中的特定行和列? 一个数据文件,我想提取它的第一到第四列,以及第九列 和第1到500行,以及501到1000行? 解决方案 data = []; data = original(:,1:4);其他类似

db2导出.del数据文件,请问如何将数据文件中的回车换行处理掉,使每条数据只占一行。

问题描述 db2导出.del数据文件,请问如何将数据文件中的回车换行处理掉,使每条数据只占一行. db2导出.del数据文件,文件中正常行分隔符为n,由于数据中某些字段的数据中含有回车换行,导致导出的数据一条数据占了不止一行,请问如何将数据文件中的回车换行处理掉,使每条数据只占一行. 解决方案 http://blog.csdn.net/xhsophie/article/details/41822287

想哭(WannaCry)勒索病毒中招后,该怎么恢复数据?(非解密)

本文讲的是想哭(WannaCry)勒索病毒中招后,该怎么恢复数据?(非解密), 一.前言 受WannaCry勒索病毒影响,许多遭受攻击的电脑中的大部分文件被加密而被勒索要求支付比特币以进行解密文件.当前没有完美的解密工具或者方案,但根据对病毒的分析,我们发现病毒采用加密原文件后再删除原文件的方式,于是针对被删除的文件就存在一定恢复的可能性,我们只要恢复出删除的原文件即可. 我们在13号嘶吼的采访中提到,可使用数据恢复软件通过恢复被删除的加密前的文件,能恢复部分文件,一定程度上挽回用户损失.应用户

布局-Android中不同xml文件中id可以重复么?

问题描述 Android中不同xml文件中id可以重复么? Android中如果两个layout布局文件中都有一个TextView控件,而且拥有同样的id,那样的话会乱套嘛? 比如我有a.xml,中间有控件TextView id为tv,有b.xml,中间有控件TextView id为tv,在R文件中能看到id内部类中只有一个tv常量,调用时是因为用之前是用色图ContentView设置了对应的布局所以不会混乱嘛,还是说就是会混乱的呢,我记得以前好像用的时候用混乱过,但是今天听老师讲课说是可行的,

嵌入式软件-比较大的项目中,头文件中声明的变量和函数一般不太好确定前面是不是要加extern把

问题描述 比较大的项目中,头文件中声明的变量和函数一般不太好确定前面是不是要加extern把 比如这个.h文件中他用了一个ifdef,这个只是一个类似一个标志吧,任何程序里面都可以这样用吗,这是比较好的方式吗 解决方案 这是查看宏定义,判断是否define了这个宏.然后决定后面的各种定义.以endif结尾 解决方案二: ifdef你可以看做if..extern表示你函数定义在别的文件里.这里应该是为了防止冲突,通过宏值,决定是否是用本类中的该函数还是其他文件的相同命名的函数(起函数功能可能有所区

java中如何读取文件中内容,并打印日历

问题描述 java中如何读取文件中内容,并打印日历 读取文件,文件中有一个8位的日期,读出后打印此日期开始的一个月日历 解决方案 用java I/O 流 ,你查一下. 解决方案二: 先学会读取文件 http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html 有了日期,日历自然出来了.

制作水晶报表,怎么讲数据库中的表,链接到解决方案中的xsd文件中

问题描述 怎么将数据库中的表,链接到解决方案中的xsd文件中Access中存在result表等,希望水晶报表直接使用xsd文件,怎么讲result表等关联进入到xsd文件中,谢谢 解决方案 本帖最后由 happy09li 于 2014-01-22 11:02:51 编辑解决方案二:本帖最后由 happy09li 于 2014-01-22 11:02:36 编辑

ASP。NET 中 在CSS文件中定义的样式背景为啥显示不出来

问题描述 ASP.NET中在CSS文件中定义的样式背景为啥显示不出来 解决方案 解决方案二:没代码怎么知道~解决方案三:给出代码.可能路径问题,或者是选择器错误.解决方案四:比较大可能是路径问题解决方案五:引用CSS文件的代码贴出来.解决方案六:可以把CSS文件放到<head></head>之间,还有你说那个问题,可以能是路径引用不对解决方案七:直接写在里面试试例如<divstyle="color:red"></div>解决方案八:应该是