顺丰删库事件有感——数据库数据恢复方法分享

  

  据悉,顺丰科技数据中心的一位邓某因误删生产数据库,导致某项服务无法使用并持续590分钟。事发后,顺丰将邓某辞退,且在顺丰科技全网通报批评。真实地玩了一把“从删库到跑路”。   

  

  
  毫无疑问地,我们又突然象被打了鸡血般,整了整衣领,挺了挺胸,存在感立马爆棚,拉个小板凳,就着中秋节的月光,絮絮叨叨地讲讲想当年。   
  我想当年,国那啥机构,设备升级改造,生产库在线热迁,脚本写错,rm掉了,然后,我们XXX,全部恢复所有数据(此处省略几万字,包含数十个自我标榜的“牛X”助词)。可惜,得替用户保密。   
  想当年,那啥机构,因为那啥,然后,……,算的了,不能说,反正老传奇了。   
  啥也不能说,就从技术角度聊一聊,论删库到恢复,再到跑不了路的作死人生。   
  我肯定不会聊找个收费或开源数据恢复软件恢复,丢不起那人。   
  不聊窗口,因为基本和它无关。   
  仅限Unix, Linux上删除oracle、db2、mysql, Hadoop等的情况,就以rm - f为例吧。   

  

  数据库的载体有多种实现方式,文件或裸设备。多数情况下,系统会以文件的方式(一切皆为文件)对数据库数据文件进行管理。一套数据库,简单地看,物理上可以理解为一个或多个文件。删库,也就是删一个或多个文件了。   
  文件是存储在文件系统内的.Unix和Linux上有很多种文件系统,这些文件系统保留相同的VFS文件访问接口,确保用户透明地使用每种文件系统(当然,也会有一些小差异,但一般都会遵循POSIX之类的标准)。但实际上,不同的文件系统在内核设计上千差万别,这也导致了rm - f的不同底层表现,再导致每个文件系统在rm - f后恢复的可能性,难度的不同。简单地说,删除文件后的恢复,并不是文件系统规范中约定的技术细节,文件系统设计人员压根就没考虑过。   
  在文件系统上恢复一个删除的库,大概的思路应该是这样的:   
  顺丰删库事件有感——数据库数据恢复方法分享”>
  </p>
  <p>
  图1:恢复被删除数据库的思路
  </p>
  <h2>
  上述方法:
  </h2>
  <p>
  指以文件为对象进行恢复,也就是恢复文件系统上删除(或丢失)的某几个文件,不关心文件的内容,仅通过文件系统的元数据进行分析和恢复。元数据是一个文件系统的管理信息,一般不以用户文件为载体,通常只能通过底层块的二进制流进行获取和分析。
  <br/>
  文件系统中,对文件的寻址大致是这样一个流程,每个文件系统在本文讨论的范围,几乎都不例外。
  <br/>
  <img src=顺丰删库事件有感——数据库数据恢复方法分享