服务器丢失数据,大多数人第一反应都会慌乱。情绪平复之后,最重要的一件事就是不要再操作这台机器。很多人着急之下直接重启服务器、拔硬盘、重装系统,甚至重建RAID阵列,原本还有机会恢复的数据,被新写入内容覆盖之后彻底无法找回。数据恢复行业有一条基础准则,数据丢失之后,每一次向磁盘写入内容,都会降低恢复成功的可能性。不管故障是什么原因,第一步先停止操作,将服务器脱离业务环境,不再产生任何写入动作。
接下来要理清丢失的数据类型以及故障产生原因。是单块硬盘硬件损坏,还是RAID阵列整体失效?是误删除文件,还是文件系统损坏?是数据库表被清空,还是整个分区无法识别?不同故障对应的处理方案完全不同。举个例子,误删除文件之后,文件数据块还保留在磁盘,仅仅索引标记为可覆盖,使用恢复软件扫描还有较大恢复概率。但如果RAID5阵列损坏两块硬盘,需要先制作全盘镜像,再在镜像文件上尝试重组阵列,绝对不能直接在原硬盘执行阵列重建。重建阵列会大量写入数据,一旦操作出错,原盘的校验信息会全部损毁。

服务器还可以进入系统,仅仅某个分区无法挂载,Linux系统可以尝试fsck,Windows系统使用chkdsk。但这两个工具存在风险,它们会尝试修复文件系统结构,部分场景下会打乱目录项。执行修复前最好先对分区制作dd镜像,所有修复操作在镜像文件上测试,原始磁盘保持不动。系统无法启动的情况下,拆下硬盘,通过只读转接设备挂载到另一台主机,使用TestDisk、PhotoRec做底层扫描。PhotoRec不依赖文件系统,依靠文件头部特征检索文件,可以找回大量碎片化文件,但文件名称和目录结构基本无法保留。
数据库恢复属于另外一套处理逻辑。MySQL的InnoDB引擎,如果只是数据表被drop,ibd文件完好,可以借助工具从ibd文件提取数据。数据库实例整体崩溃,但binlog文件还存在,可以依靠备份文件搭配binlog实现时间点恢复。SQL Server有专门的日志读取工具,可以解析事务日志,反向生成撤销操作脚本。但这类操作技术门槛很高,缺少相关经验很容易损坏仅剩的日志文件。
硬件故障,个人能够操作的空间很小。硬盘出现异响、磁头损坏、电路板烧毁这类问题,软件层面完全无法解决。网上一些教程教用户开盘更换磁头,但普通环境达不到无尘要求,一粒灰尘就会直接损毁盘片。这种情况只能联系专业数据恢复公司,他们配备洁净间和备件库,可以开盘读取盘片数据。这类服务费用偏高,几千到上万元不等,但对比数据本身的价值,很多场景下依旧值得选择。
RAID阵列恢复更为复杂。很多用户遇到RAID崩溃,第一反应就在RAID卡选择Rebuild重建,这个操作风险极高。损坏硬盘顺序判断错误,或是RAID参数记忆有误,Rebuild会直接抹除剩余硬盘内的数据。正确流程是先把每一块硬盘制作镜像,之后使用专业工具分析RAID参数,包含条带大小、硬盘顺序、校验方向,在虚拟环境重组阵列。阵列重组成功之后,再导出数据。这个过程没有试错机会,一步失误数据就全部丢失。
说了这么多,更关键的不是数据丢失之后如何抢救,而是提前做好防护。备份领域的3-2-1原则已经提出很多年,但真正落地执行的人不多。三份数据副本,存储在两种不同介质,其中一份异地存放。云备份、本地NAS、离线硬盘可以组合使用。数据库开启binlog,文件服务器开启快照功能,重要操作执行前手动创建快照。这些操作耗时不多,一旦发生故障,备份就是最后的保障。
最后提醒,如果打算自行尝试数据恢复,第一件事制作磁盘镜像。利用ddrescue或者HDD Raw Copy工具完整克隆原盘,后续所有操作都在镜像文件上进行,原始磁盘封存,不要通电、反复插拔。镜像制作失败还可以重新操作,原盘一旦操作失误,没有补救机会。数据恢复不靠运气,核心就是尽量减少错误操作。