【服务器数据恢复】raid5下mysql数据库数据恢复案例
服务器数据恢复环境:
同友存储,底层由数块物理硬盘组建的raid5磁盘阵列,存储池划分若干lun,每个lun下有数台虚拟机。
服务器故障:
未知原因导致存储崩溃,无法启动,虚拟机全部丢失,其中一个lun中的3台虚拟机数据尤为重要,需要恢复其中的数据。
服务器数据恢复过程:
1、将故障存储中的所有磁盘以只读方式进行全盘镜像备份,后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始数据造成二次破坏。
2、基于镜像文件分析raid5阵列,发现故障存储中的raid5阵列缺失2块磁盘,热备盘已经启用。通过实际情况可以推断故障发生的大致过程:第一块硬盘掉线后raid5启动热备盘替换。第二块硬盘掉线后raid5降级,第三块硬盘掉线导致raid5阵列崩溃。这种情况下一般是无法通过校验直接获取到缺失盘的数据,只能使用磁盘同等大小的全0的空镜像进行raid重组(依赖空镜像组建的raid的文件系统结构会严重损坏,相当于每个条带都缺失两个块的数据,所以除特殊情况外不建议如此操作)。
重建raid:
3、通过重组出来的raid5阵列提取LUN。通过对存储结构的进一步分析获取到存储划分的MAP块,对各个LUN的数据块指针进行解析并由北亚企安数据恢复工程师编写程序提取LUN碎片。碎片提取完成后进行碎片拼接,组成完整的LUN。
提取LUN:
4、导出LUN内所有虚拟机并尝试启动,结果由于操作系统被破坏,虚拟机无法启动。
5、提取虚拟机内的文件,但虚拟机内的文件多数损坏严重,只有少数文件可用,只能通过其他方案进行恢复。
6、本次需要进行数据恢复的虚拟机内有mysql数据库,可以根据mysql数据库底层存储的特殊性扫描数据页并提取数据。
数据恢复过程截图:
7、根据mysql数据页特征扫描数据页并导出数据(仅适用于innodb引擎数据库,myisam引擎数据库没有“数据页”概念),分析系统表获取各用户表信息,根据各个表的id分割数据页。
8、因为该数据库的表结构变更过多次,存储故障导致系统表的部分数据丢失,所以记录提取过程非常痛苦(这里不赘述)。
获取最早版本数据库各个表的表结构。由于合并快照前的父盘因为写入较早,使用第一块掉线盘进行校验获取到完整数据,然后提取出其中数据库各个表的表结构。用户方提供了最新版本数据库的建表脚本。
分别使用两组不同表结构提取数据记录并导入到搭建好的环境中的mysql数据库内,剔除各个表中因为表结构变更所导致的乱码数据,最后将两组数据分别导出为.sql文件。
数据验证:
两个版本的数据库表结构不同,先联系用户方工程师进行调试,调试完成后导入平台进行测试,平台测试成功,本次数据恢复工作完成。