某公司使用了同友存储,采用raid5磁盘阵列,由于未知的原因导致存储忽然崩溃无法启动,raid5阵列中的虚拟机全部丢失,其中3台虚拟机为重要数据,需要主要针对该3台虚拟机进行数据恢复。
一、分析存储底层次结构,制定数据恢复方案。
通过与客户的沟通及对raid阵列的分析得出故障存储的底层结构为若干物理磁盘组成一个存储池,划分了多个lun,需要进行数据恢复的为lun1,其中包含重点恢复的3台虚拟机。如下图所示:
存储结构
二、尝试重组raid恢复raid阵列数据。
在对阵列进行分析重组时发现用户原存储中的raid5阵列共缺失2块硬盘,热备盘已经启用。(还原故障过程为:第一块硬盘掉线后系统启动热备盘进行替换,第二块硬盘掉线时raid5处于降级状态,第三块硬盘掉线导致raid阵列崩溃。)这种情况下通常无法通过校验直接获取丢失盘的数据,所以只能使用磁盘同等大小的全0镜像进行重组(由于依赖空镜像组成的raid文件系统结构会被严重破坏,相当于每个条带都会缺失两个块的数据,所以除非常情况下不建议如此)。
重建raid
三、通过重组的raid阵列提取LUN。
通过对存储结构的进一步分析我们可以获取到存储划分的MAP块,进而对各个LUN的数据块指针进行解析,通过编写数据提取程序(也可借助北亚数据恢复工具)提取LUN碎片。提取完成后进行碎片拼接,组成完整LUN。
提取LUN
四、导出LUN内所有虚拟机,尝试启动。
因虚拟机名称涉及客户隐私且导出过程较为简单,此处不再赘述。导出虚拟机后尝试启动,同预想相同,操作系统被破坏虚拟机无法启动。
五、提取虚拟机内文件。
由于虚拟机无法启动,只能对虚拟机内的文件进行提取,但多数文件破坏严重,只有少数文件可用,只好继续制定其他数据恢复方案。
六、通过分析数据库页提取数据。
本次数据恢复的虚拟机内有mysql数据库,可以利用数据库底层存储的特殊性进行数据页扫描,提取数据。(注,虚拟机启用快照,父盘和快照文件都被损坏的情况下常规合并操作无法完成,使用本公司自主研发VMFS快照合并程序进行快照合并。)数据恢复过程截图如下
七、获取mysql数据页并分析。
根据mysql数据页特征进行数据页扫描并导出(innodb引擎可以使用此方案,myisam因为没有“数据页”概念所以不可用),分析系统表获取各用户表信息,根据各个表的id进行数据页分割。因为表内容涉及用户隐私,此处未配图
八、提取表结构、提取记录。
因为数据库使用时间已久,表结构也曾多次变更,加上系统表在存储损坏后也有部分数据丢失,记录提取过程遇到很大阻力。首先获取最初版本数据库各个表的表结构:合并快照前的父盘因为写入较早,使用第一块掉线盘进行校验获取到这个文件的完整数据,然后提取出其中数据库各个表的表结构,之后客户方提供了最新版的数据库建表脚本。
分别使用两组不同表结构对数据记录进行提取并导入恢复环境中的mysql数据库内,然后剔除各个表中因为表结构变更造成的乱码数据,最后将两组数据分别导出为.sql文件。
九、数据验证,raid数据恢复成功。
因为两个版本的数据库表结构不同,所以联系了客户方的应用工程师进行调试。调试完成后导入平台,平台调试成功,本次数据恢复成功。