目录
MongoDB数据丢失的场景
MongoDB是一款NoSQL-文档存储 数据库,目前没有商用恢复软件或工具。
MongoDB出现SQL命令误删除(整个库、集合、文件)、操作系统rm误删除文件、勒索病毒恶意破坏等,或者在扩容、均衡等操作出现异常,都可能导致数据无法访问,需要数据恢复。
MongoDB存储结构分析
MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成:
MongoDB的数据存储db文件中,此文件结构如下:
当db文件被物理被删除删除时,为了达到最大化数据恢复,需要从Document的级别恢复。以下为ns文件和db文件的关键结构信息:
class DiskLoc {
int _a; // 数据文件编号,如mydb.0编号为0
int ofs; // 文件内部偏移
};
每个数据文件包含一个固定长度头部DataFileHeader
class DataFileHeader {
DataFileVersion version;
int fileLength;
DiskLoc unused;
int unusedLength;
DiskLoc freeListStart;
DiskLoc freeListEnd;
char reserve[];
};
struct Extent {
unsigned magic;
uint32 myLoc;
DiskLoc xnext;
DiskLoc xprev;
int length; // extent总长度
DiskLoc firstRecord; // extent内第一个record位置指针
DiskLoc lastRecord; // extent内最后一个record位置指针
char _extentData[4]; // extent数据
};
class Record {
int _lengthWithHeaders; // Record长度
int _extentOfs; // Record所在的extent位置指针
int _nextOfs; // 前一个Record位置信息
int _prevOfs; // 后一个Record位置信息
char _data[4]; // Record数据
};
MongoDB数据恢复代码实现
通过解析MongoDB源代码,及对应数据库文件结构,我们编写了MongoDB数据恢复工具,核心代码如下:
打开源文件代码:申请READONLY只读权限,确保对源文件是只读访问,杜绝二次破坏!
MongoDB数据恢复步骤
- 将Data-Unit_MongoDB_Restore.exe放在有足够可用空间的目录下。如果需要从某分区中搜索碎片,如D盘,则一定不能将工具放在D盘,切记!
- 运行恢复工具,如果提示缺少dll,请安装vc_redist.2015x64.exe
支持以下4种数据源:
- 裸磁盘(整个磁盘):直接输入磁盘序号,如下图,以管理员权限运行工具,输入数字2,则扫描磁盘2。注意windows的磁盘从0开始编号
- 分区:以管理员身份运行工具,输入盘符,如 D
- 镜像文件(裸磁盘或分区的镜像文件,支持任意文件系统,如ext3、ext4、XFS、NTFS、VMFS5、VMFS6、vmdk、VHD文件,等等):用鼠标,直接将文件拖入cmd窗口即可
- 残缺的db文件:用鼠标,直接将文件拖入cmd窗口即可
- 按下回车开始扫描,Data-Unit_MongoDB_Restore自动将找到的数据输出到MongoDB_restor_file目录
MongoDB数据恢复近期案例1
MongoDB数据恢复近期案例2
技术支持
温馨提示:如重要数据丢失,建议在行动前咨询专业工程师,以免数据遭到二次破坏。
直接技术支持:shop396558956.taobao.com