作家
登录

如何从MySQL/InnoDB数据文件中的恢复数据

作者: 来源: 2013-09-18 13:15:16 阅读 我要评论

在上上周给下厨房做过一次数据恢复(故障回顾:故障发生的技术总结 致歉信),恢复使用了开源工具Percona Data Recovery Tool for InnoDB(后面简称PDRTI),这里分享一下期间的注意事项,和遇到MySQL数据丢失的一些应对。

本文主要介绍在使用Percona Data Recovery Tool for InnoDB时候的一些注意事项,并不包括具体的step by step的使用步骤,使用文档可以参考:Reference Manual and Documentation。

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自己启动,并根据事务日志恢复出当前一致的数据。

5. 最后,没有最后了

如果你需要数据恢复,可以联系我,提供免费的咨询,和收费的恢复服务。另外,如果需要专业服务可以联系沃趣科技,他们提供专业的、完整的数据库服务。

原文链接:http://www.orczhou.com/index.php/2013/07/how-to-recover-data-from-mysql-innodb-data-file-ibd-file/

【编辑推荐】

  1. Linux下的Mysql数据库自动备份
  2. 数据恢复:仅仅只做备份是不够的
  3. 跳过rman坏块进行数据恢复
  4. MySQL集群性能优化指南

  推荐阅读

  对 Nginx SSL 的性能进行调整

这篇文章是讲web服务器方面的性能调整,不包括数据库性能的调整。初始化服务器这个web服务器运行在一个EC2 t1.micro 环境.我选择 Nginx + PHP5-FPM 来运行php页面,出于安全考虑我使用SSL。测试性能我使用Blitz.io来进>>>详细阅读


本文标题:如何从MySQL/InnoDB数据文件中的恢复数据

地址:http://www.17bianji.com/yunwei/33888.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)