从删库到恢复到跑不了路-数据恢复工程师解说顺丰删库事件

本文由北亚数据恢复中心(http://www.frombyte.com)张宇所写,若有错误,祝愿各位中秋节删库还跑不了路。mysql

事件回顾:

据悉,顺丰科技数据中心的一位邓某因误删生产数据库,致使某项服务没法使用并持续590分钟。事发后,顺丰将邓某辞退,且在顺丰科技全网通报批评。真实地玩了一把“从删库到跑路”。
顺丰删库事件
毫无疑问地,咱们又忽然象被打了鸡血般,整了整衣领,挺了挺胸,存在感立马爆棚,拉个小板凳,就着中秋节的月光,絮絮不休地讲讲想当年。
想当年,我国那啥机构,设备升级改造,生产库在线热迁,脚本写错,rm掉了,而后,咱们XXX,所有恢复全部数据(此处省略几万字,包含数十个自我标榜的“牛X”助词)。惋惜,得替用户保密。
想当年,那啥机构,由于那啥,而后,……,算了,不能说,反正老传奇了。
啥也不能说,就从技术角度聊一聊,论删库到恢复,再到跑不了路的做死人生。
我确定不会聊找个收费或开源数据恢复软件恢复,丢不起那人。
不聊Windows,由于基本和它无关。
仅限Unix、Linux上删除oracle、db二、mysql、Hadoop等的状况,就以rm -f为例吧。
数据库的载体有多种实现方式,文件或裸设备。多数状况下,系统会以文件的方式(一切皆为文件)对数据库数据文件进行管理。一套数据库,简单地看,物理上能够理解为一个或多个文件。删库,也就是删一个或多个文件了。
文件是存储在文件系统内的。Unix和Linux上有不少种文件系统,这些文件系统保留相同的VFS文件访问接口,确保用户透明地使用每种文件系统(固然,也会有一些小差别,但通常都会遵循POSIX之类的标准)。但实际上,不一样的文件系统在内核设计上千差万别,这也致使了rm -f的不一样底层表现,再致使每一个文件系统在rm -f后恢复的可能性、难度的不一样。简单地说,删除文件后的恢复,并非文件系统规范中约定的技术细节,文件系统设计人员压根就没考虑过。
在文件系统上恢复一个删除的库,大概的思路应该是这样的:
顺丰删除数据库跑路事件
 图1:恢复被删除数据库的思路linux

上述方法A:

指以文件为对象进行恢复,也就是恢复文件系统上删除(或丢失)的某几个文件,不关心文件的内容,仅经过文件系统的元数据进行分析和恢复。元数据是一个文件系统的管理信息,通常不以用户文件为载体,一般只能经过底层块的二进制流进行获取和分析。
文件系统中,对文件的寻址大体是这样一个流程,每一个文件系统在本文讨论的范围,几乎都不例外。
从删库到恢复到跑不了路-数据恢复工程师解说顺丰删库事件
 图2 文件寻址链算法

“节点”表述一个文件(或目录)的摘要信息,也包括指向下一层数据单元的指针,下一层数据单元指一个或多个指向,多是一些附加信息,但确定会指出“数据块索引”。
“数据块索引”是指指向真正数据区的指针信息。
“数据块”就是数据自己。
除非在SSD等介质上启用TRIM通知硬盘清除数据,不然为了效率,删除数据,并不会清除数据区,只会打上可重用的标签,这是文件恢复的原理所在。
重点1:删除文件恢复的第一个有可能特别好用的方法是lsof。
Linux系统中使用rm -rf删除文件后,其实文件节点只是从目录树中移除,文件内容仍是在系统后台等待回收,此时有机会使用系统进程号将文件拷贝出来。
# lsof |grep data.file1
  # cp /proc/xxx/xxx/xx  /dir/data.file1
这个方法和个人专业关系不大,详情查google。
若是lsof找不出来,那就能够考虑从文件系统角度进行删除恢复了。
按恢复的方法,文件系统大体分为三类:sql

I类:

UFS(Solaris、BSD等使用),Ext2/3/4(Linux最通用的文件系统),JFS(Aix最先使用),OCFS1/2,HTFS(SCO)。
这类文件系统,使用固定的节点长度,和固定的节点区域。文件系统上的全部文件(或目录)都会在节点表中有惟一一个编录对应,用来作寻址文件的起点。这类文件系统在删除文件时,通常会将节点进行清0操做(由于节点编号和位置是物理上固定的,删除文件后必须能够重用,节点区操做也较为集中和频繁,通常设计时会在删除时顺手清0),清0后,节点到数据块索引之间的纽带就断开了,本来一对一的映射关系,变成了N对N,N是文件总数。
因此,这类文件系统在删除文件后恢复时,每每名称和目录对应较为困难,像医院的PACS、OA、邮件系统、语音库、地质采样、多媒体素材,也包括数据库文件等的对应。(插播广告:咱们,也就是北亚数据恢复中心,www.frombyte.com,视钱如命,这种没人作的活,咱们接)。
特殊地,一些linux上的开源数据恢复软件,ext3grep之类的,为什么能恢复Ext3/4上删除的文件呢?
是由于,Ext3/4文件系统支持日志回滚,系统会在格式化时创立一个日志文件(用户不可见),典型的大小有32M~128M之间,在删除文件时,节点会先行复制到日志文件中,再进行删除,以确保操做意外中断时,可回到上一个干净的稳定状态。
但缺点也显而易见,日志是不断循环回滚的,若是时间过久,或文件系统操做频繁,就没那么容易了。典型地,若是删除大量文件,靠这个方法,只能恢复一部分。
固然,能够再给一计了。重点2:删除后,若是lsof搞不定,有可能的话,第一时间dd文件系统进行归档保护。别觉得不断地ls,find会有奇迹出现,会雪上加霜的。数据库

II类:

XFS、ReiserFS、JFS2(for AIX)、ZFS、NetApp WALF、EMC Isilon、StorNext、NTFS。
这类文件系统,节点区域为可变区域,删除数据时不少时候不会清除数据。oracle

缘由大概是:

一、区域可变,节点大小就能够设大一些,清除太浪费性能;
二、区域可变,缓冲区就不必定很好命中,清除节点时只需在位图上作手脚就好了;
三、区域可变,可考虑区域重定向,原区域也就不必理会了。
节点不作清除,意味着“节点->数据块索引->数据块”的链条不会被打断,天然也就容易恢复数据了。
其实也是有难度的,删除一个文件,必然要表如今文件系统层面释放,因此,可能“节点->数据块索引->数据块”整个链条会成为游离态,也可能象zfs同样,会出现很是多的副本,分拣也会有难度。不一样的文件系统,会有不少信息之间存在关联,好比JFS2中索引块会记录上一项、下一项;ZFS会在节点中记录下一项数据的HASH等,根据这些匹配点,就能够匹配、择优找到最恰当的数据恢复起点。因不一样的文件系统,有不一样的针对性的方法。ide

III类:其余吧。

好比Vxfs、HFS+结构上像II类,但由于节点区域每每集中在前部,命中率较高,在设计上,删除文件就会作清0或重构树操做,数据恢复的难度又如同I类。
好比ASM,严格来讲,也不太像文件系统了,反正结论是文件系统自己没有太好的算法,保证删除后可恢复(但依靠文件内部结构,恢复的可靠性很是高)
好比VMFS,基本是个大块分配的文件系统,恢复方法和方案和本文多有不一样,一扯内容有点多,有空专门扯。
上述,是针对完整恢复文件的思路进行描述的,但也如上文所述,有时文件是没法恢复的,也可能文件部分被破坏、覆盖。
若是文件内容都还在,但文件系统元数据部分已经没法支撑对文件信息的还原,那就能够考虑从文件内容的关联性上作文章。
好比Oracle数据文件,多数状况下,按8K为页大小,可喜的是,每一页的头部都有页校验、页编号和可能的文件编号。按页校验从磁盘底层扫描出全部数据页后,统计文件编号和页编号,幸运的话,就可能把文件拼接起来。
Oracle的控制文件会记录数据文件逻辑、物理之间的关联,分析后,文件名称、路径就不难还原了。
一样的方法,可大体适应于Sql Server、MySQL InnoDB。思惟稍作变通,可适应Sybase、DB2等。
若是是MySQL MyISAM引擎,也有办法。记录是一行一行依次压入文件中的,若是某个表有主键,或特殊的字段,或特殊的表结构,就能对全部磁盘上符合条件的块进行归类。MyISAM还会有行溢出、行迁移的状况,即存在A指向B的数据关联关系,根据这个关系,也能够进一步匹配块记录的排列逻辑,从而组合数据文件。对于MyISAM,这其实也是恢复表或恢复记录的方法。
这是根据文件内容,恢复完整文件的思路。若是文件内容不完整,或副本太多致使排重难度太大呢?---恢复表或表记录。
根据表与表之间的差别,通常状况下,能够容易对找出的全部多是数据库的片段进行归类,归类的最直接方案是按表进行。
按表概括为相同一组单元后,就能够从记录角度进行分拣和排错了,若是能够借助于索引、空间分配、其余关联表等信息,能够容易对恢复的表单元进行数据清洗,幸运的话,数据多是完整的。
若是表概括为同一单元后,与索引不对应、有错误记录等,致使数据库没法修复启动,就能够按表结构,对表单元,以记录的方式进行抽取->插入新库->数据定向清洗。虽然结果可能不是完美的,但不少状况下,总比没有强。
还有图1中方法C2,从日志中恢复记录。这个日志是广义的,包括归档、过程性语句表述等一切可能有记录痕迹的数据集。在主数据文件是破坏的状况下,这些任何可能包含记录的数据集,都应该是分析的对象。也如同数据库文件,按文件、结构块、记录的思路进行最大程度的恢复。结合C一、C二、C3,再作定向性的数据集合和数据清洗,数据恢复的手段也就到头了。
忘了聊一句Hadoop了,Hadoop,Hbase在删除时触发的是节点文件系统上的文件删除行为,以最多见的Linux为例,其实就是Ext3/4上删除文件的恢复问题,若是文件恢复不了,再参考Hadoop的HASH、fsimage之类的进行数据块关联。如同上述数据库的思路。
显而易见的是,恢复方法越向后,汇总的生产数据问题越多,数据逻辑的排查和纠正将会让太多人夜不能寐,咬牙切齿,这时候,可能跑路都会被你们堵回来。得,仍是乖乖地给你们买咖啡,向老板贡献整年工资和资金,装着蓬头垢面、愁云满面的样子吧,兴许你们还能答应天天让你睡上2个小时。oop

相关文章
相关标签/搜索