首页 > 数据库 > MySQL > 正文

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

2024-07-24 12:37:08
字体:
来源:转载
供稿:网友

1.简述恢复原理

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

2.并行的恢复

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

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

  1. #!/bin/bash 
  2. ws=/u01/recovery 
  3. pagedir=/u01/recovery/pages-1372436970/FIL_PAGE_INDEX 
  4. logdir=/u01/recovery/log 
  5. rectool=/u01/recovery/percona-data-recovery-tool-for-innodb-0.5/constraints_parser 
  6. cd `dirname $rectool` 
  7. count=0 
  8. page_count=353894 
  9. page_done=0 
  10. startdate=`date +%s` 
  11. for d1 in `ls $pagedir` 
  12. do 
  13.   count=$(($count+1)) 
  14.   echo "in page $d2 at dir $d1" > $logdir/$count.log 
  15.   thedate=`date +%s` 
  16.   echo "$page_done / $page_count at $thedate from $startdate" 
  17.   total=`ls -l $pagedir/$d1/|wc -l` 
  18.   page_done=$(($page_done+$total)) 
  19.   threads=`ps axu|grep parser_jobs|grep -v grep|wc -l` 
  20.   echo $threads 
  21.   while [ $threads -gt 48 ]; 
  22.   do 
  23.     sleep 1 
  24.     threads=`ps axu|grep parser_jobs|grep -v grep|wc -l` 
  25.   done 
  26.   $ws/parser_jobs.sh $pagedir/$d1 > $ws/job.log 2>&1 & 
  27. done#!/bin/bash 
  28. pagedir=/u01/recovery/pages-1372436970/FIL_PAGE_INDEX 
  29. logdir=/u01/recovery/log 
  30. rectool=/u01/recovery/percona-data-recovery-tool-for-innodb-0.5/constraints_parser 
  31. logfile="$logdir/`basename $1`.log" 
  32. echo "$1" > $logfile 
  33. if [ -d $1 ];then 
  34.   for d2 in `ls $1` 
  35.   do   //Vevb.com 
  36.     $rectool -5 -f $1/$d2 >> $logfile 2>/dev/null 
  37.   done 
  38. fi 

3.从索引中恢复

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

4.紧急情况下的问题处理

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表