MongoDB数据库文件损坏恢复数据全过程

一.故障描述

客户设备环境为一台操作系统为Windows Server 2008的服务器,部署MongoDB数据库。由于业务需要,客户在未关闭MongoDB数据库服务的情况下,对数据库文件进行了拷贝。将数据库文件拷贝到其他分区后,客户对原数据库分区进行了格式化操作,后将数据库文件拷回原分区,重新启动MongoDB服务,这时,客户发现服务无法启动。报错如下:

图一:

二.故障检测

一般来说,在服务没有关闭的情况下,直接对MongoDB数据库文件进行拷贝,由于服务还在运行,会导致mongod.lock文件以及WiredTiger.lock文件拷贝出现错误,这个时候在拷贝出的文件中删除这两个文件,再次启动服务,由MongoDB自行重新生成即可。
但是通过对客户拷贝出的文件进行现场检测发现,客户拷贝出的数据库文件中,_mdb_catalog.wt文件丢失。
mdb_catalog.wt文件里存储了MongoDB中所有集合的元数据,数据库启动时需要从这个文件中读取相关的信息。由于此文件丢失,导致数据库无法获取数据库中集合对应的名字,集合的创建选项,集合的索引信息等元数据,数据库无法启动。

三.数据恢复

首先我们尝试从文件系统的角度对_mdb_catalog.wt文件进行恢复。
使用专业数据恢复软件对数据库分区进行扫描,查看扫描结果,并没有_mdb_catalog.wt文件的信息。根据MongoDB数据库中,数据文件的特征值,对数据库分区进行扫描,也没有发现_mdb_catalog.wt相关的数据区域。由此判断,_mdb_catalog.wt文件已经被彻底覆盖破坏,无法恢复。
此时只能从数据库的层面想办法提取其中的数据了。
客户所部署的MongoDB数据库是基于WT存储引擎的数据库系统,这样的话我们就可以使用WT实用工具包提取数据库中的数据。
首先下载WT实用工具包,然后再windows环境下编译出可执行的wt工具。

图二:
编译完成后,使用wt工具,先对数据库的集合文件中的数据进行清洗,完成后,直接读取文件中的数据,写入到一个dump文件中。
这个时候我们就已经把数据库的各个集合文件中的全部可用数据提取出来了,下一步我们要做的就是还原数据库环境。
重新创建一个MongoDB数据库,根据我们提取出的集合文件,创建对应数量的空集合,然后使用wt工具,将提取出来的dump文件一一写入到新创建的空集合中。这个时候就可以通过查询集合中的数据,确认这些集合与元数据库中集合的对应关系,修改集合名称,重建索引信息,到这,数据恢复基本就已经完成了。
通过查询集合中的记录,确定记录类型,从而确定fs.files和fs.chunks集合的位置后,修改这两个集合名称为xxx.files和xxx.chunks后,重建集合索引,集合恢复完成,可以正常查看其中数据:

图三:

图四:

四.数据验证

协助客户对全部集合进行索引重建之后,客户对数据库整体进行查询验证,数据无误,此次数据恢复圆满成功。

原文地址:http://blog.51cto.com/sun510/2315807

时间: 2024-10-07 10:11:10

MongoDB数据库文件损坏恢复数据全过程的相关文章

Oracle dmp文件损坏恢复案例

前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下 一.描述 这个dmp文件是从一个Oracle 9i的数据库上exp出来的,在导入Oracle 11g版本的时候,可能会随机出现两类错误,如下 (1)dmp文件导入的时候,一直停留在某张表上不动,两三天都是这样,导入操作无法进行,如下 导入了                                                             0 行 . . 正在导入表    

研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具,现在公布一下. 此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本.恢复Sybase SQL Anywhere的工具在国内应该算首创. 本工具的应用场景: 1.因为物理磁盘故障.操作系统.系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况: 2.误操作,包括truncate table,drop table

关于数据库文件损坏风险的提醒

前言 小y最近处理了几起Oracle数据库文件损坏的case,因为某些Bug风险较大,因此不敢有丝毫怠慢,赶紧拿出来分享!希望能够帮助到有需要的朋友!风险提示! 如上图所示,Linux 5/6上的一个已知缺陷,在某些触发条件下,将导致Oracle数据文件出现内容全是0的的坏块.该操作系统上的缺陷,除了会导致Oracle数据库数据文件损坏外,还会导致包括归档日志.在线日志的损坏.而如果是current状态的在线日志发生损坏,那么对于数据库的影响将是致命的.需要引起重视! BUG触发条件: 当同时满

python操作MONGODB数据库,提取部分数据再存储

目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数.从每个集合中提取的数据存放到新的对应集合中,新集合名称为原先集合加"_col". 用到相关技术点: 操作MONGODB: 先通过IP和端口号连接到MONGODB所在的机器,得到一个MONGODB客户端对象,然后认证某个数据库的账号密码连接到该数据库,得到一个该数据库的对象.一个数据库下有很

sql-server的添加数据库文件(日志数据)以及收缩数据库文件(日志数据)

环境: SSMS sql-server2016 一.为数据库添加数据文件 添加日志数据文件 以下是添加数据文件和日志文件的代码 ALTER DATABASE [joinbest] ADD FILE ( NAME = N'joinbest_2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\joinbest_2.ndf' , SIZE = 8192KB , FILEGROWTH

数据库文件损坏修复

[场景]:对象浏览器中只有数据库名,数据库展不开,查看日志[由于数据库没有完全关闭,无法重新生成日志.],推测原因是服务器异常关停,造成数据库没有正常写完数据造成. [处理方法]:修复数据,舍弃异常数据.DBCC CHECKDB (mydb, REPAIR_ALLOW_DATA_LOSS),前提是要在单用户下 [完整的处理方法]: ALTER DATABASE [mydb] SET EMERGENCY --EMERGENCY状态下 数据库标记为 READ_ONLY,并禁用日志记录,并且仅限 sy

mongodb数据库被黑客删除数据的表现

前些日子看阿里云便宜,买了一个,安装了一个mongodb,自己连着做调试. 好久没用了,今天突然惊喜的发现被黑客登录了.没想到居然还有人靠这么低级的漏洞混饭吃. 被黑的表现如下: > show dis HOW_TO_RESTORE_mydb1 0.078GB HOW_TO_RESTORE_mydb2 0.078GB README 0.078GB local 0.078GB mydb1 0.453GB mydb2 0.453GB 其中mydb1的数据和mydb2的数据都被清空了. 从mongodb

mongodb数据库备份导入导出数据

备份数据: mongodump -h 192.168.2.20 -u game -p 12345678 -d dbname -o /data/test/ --excludeCollection=user_stats 其中-h为IP地址,-u账号,-p密码,-d数据库名称,-o存储数据的路径,--excludeCollection表示需过滤的集合,--excludeCollectionsWithPrefix表示过滤某些集合的前缀 导入数据: mongorestore --db gourmet --

oracle导入dmp文件(恢复数据)

以下操作使用oracle管理员身份进行(如:sysdba) 1. 创建表空间 说明:创建的表空间名称需要和导出dmp那个表空间名称对应 create tablespace clims logging datafile 'D:\app\scott_ns\clims.dbf' size 100m autoextend on next 50m extent management local; 2. 创建用户 说明:创建的用户名称需要和导出dmp那个用户名称对应 create user clims id