目录

问题:

1. 环境准备

1.1 安装MongoDB

1.2 安装Wiredtiger

1.3 文件打包

2. 恢复数据

1.『打捞』出可以被恢复的部分

2. 做些必要的数据格式调整

2.1 wt --> dump

2.2 a new collection

2.3 dump --> new wt

2.3 完善一下

3 收工

MongoDB使用建议


问题:

固态硬盘突然换掉,系统盘数据全部丢失,安装在固态硬盘的系统Win10和软件Python、MongoDB等都没了......

好在之前安装了双系统,Ubuntu在机械硬盘,MongoBD中的数据存也放在了机械硬盘,数据文件(总共2.5G)还在,所以想办法恢复

1. 环境准备

1.1 安装MongoDB

sudo apt-get install mongodb

建立数据库文件夹

ailab@PC-CYQ:~$ sudo mkdir /data
ailab@PC-CYQ:~$ cd /data
ailab@PC-CYQ:/data$ sudo mkdir db
ailab@PC-CYQ:/data$ ll
总用量 12
drwxr-xr-x  3 root root 4096 1月  16 19:11 ./
drwxr-xr-x 25 root root 4096 1月  16 19:11 ../
drwxr-xr-x  2 root root 4096 1月  16 19:11 db/

启动MongoDB服务

ailab@PC-CYQ:/data$ sudo chmod 777 db
ailab@PC-CYQ:/data$ sudo mongod

这里说 exception in initAndListen: 29 Data directory /data/db not found., terminating

我们自己创建文件夹,并更改权限,再次测试可以使用

1.2 安装Wiredtiger

Wiredtiger官网:  http://source.wiredtiger.com/index.html

wget http://source.wiredtiger.com/releases/wiredtiger-3.0.0.tar.bz2
tar xvf wiredtiger-3.0.0.tar.bz2
cd wiredtiger-3.0.0sudo yum install snappy-devel -y    #如果是ubuntu则用 sudo apt-get install libsnappy-dev build-essential./configure --enable-snappy
make

1.3 文件打包

准备好要恢复的collection*****.wt,以及读取它必备的_mdb_catalog.wtsizeStorer.wtstorage.bsonWiredTigerWiredTiger.basecfgWiredTiger.lockWiredTiger.turtleWiredTiger.wt。我们可以把这些文件放到一个新目录,比如本例放到dump(或者其他的,任意)文件夹下,目录结构如下:

collection-0--282010455938071573.wt          # 要恢复的collection文件
_mdb_catalog.wt
sizeStorer.wt
storage.bson
WiredTiger
WiredTiger.basecfg
WiredTiger.lock
WiredTiger.turtle
WiredTiger.wt

2. 恢复数据

切换到wiredtiger目录下:

1.『打捞』出可以被恢复的部分

./wt -v -h ../dump -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R salvage collection******.wt

这一步操作会读取我们指定的collection*****.wt,忽略所有无法被恢复的数据,然后把新数据覆盖回去。当然你也可以修改参数让它把salvage后的文件写到另一个地方。

运行上述命令会输出WT_SESSION.salvage 100这样的结果,后面那个数量其实就是所有能被恢复的数据。但是你现在还不能把这个直接读取到MongoDB。

2. 做些必要的数据格式调整

因为上一步产生的wt文件还没法直接用MongoDB读,所以我们接下来这几步就利用wt的dump和load工具想办法把他们导入到MongoDB。

2.1 wt --> dump

注意这一步操作指定的collection不需要写wt扩展名了

./wt -v -h ../dump -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f ../collection.dump collection******

这一步会把我们刚打捞出来的健康的wt文件dump到上级目录的collection.dump文件(当然这个文件叫什么名、存哪里你自己定,下一步你还能找到就行)。

还要注意的是这一步程序是没有任何状态输出的(如果你看到了估计肯定是错误提示……),如果想看到进度的话可以用shell中的ls -l等命令通过观察collection.dump文件的变化来揣测进度,以及带给你一些程序确实运行成功了的安全感。

2.2 a new collection

这一步主要是为接下来的load做准备:我们要建立一个新的数据库,然后把上一步dump的数据导入进来,然后还有几个关键而鬼畜的步骤,后面都会提到,所以这一步还是老老实实跟着做一下吧。

来,我们先启动一个新的Mongo实例,我举个栗子,可以这么做:

mongod --dbpath tmp-mongo --storageEngine wiredTiger --nojournal

然后我们要连接这个实例并创建一个新集合

mongo
> use Recovery
> db.brokedCollection.insert({test: 1})
> db.brokedCollection.remove({})
> db.brokedCollection.stats()

我们创建了一个新的叫做Recovery的数据库,并且插入移除过文档,所以这些集合的数据文件会被生成。使用stats()方法可以查看集合所对应的wt文件名称,当然了,因为我们只使用了一个集合,所以跑到tmp-mongo目录下ls一下也就知道这个collecion对应的wt文件是哪个了……为什么要知道这个?当然是下一步要用了……

2.3 dump --> new wt

接下来是见证奇迹的时刻:我们的数据很快就可以重现Mongo了!

./wt -v -h ../tmp-mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R load -f ../collection.dump -r collection******

这一步就是把前面转出来的dump文件读入上一步生成的collection文件,所以-h指定的当然是我们上一步用的新mongo实例的路径。执行这一步的时候需要先把Mongo关上,不然mongo进程会霸占着这个wt文件不让你操作。

这个操作是有一个进度展示的table:collection-******: 356

来来来,见证一下奇迹:现在可以再用2.2里的方式启动这个Mongo实例了

mongo
> show dbs              //应该可以看到Recovery有数据了
> use Recovery
> show collections      //应该可以看到brokedCollection里有数据了
> db.brokedCollection.count()   //是0?呐尼?

看到0的那一刻估计你又开始紧张了,别急我们慢慢来,如果到这一步就能解决问题的话我们何苦要折腾出2.2.2这一步。

> db.brokedCollection.find({}, {_id: 1})

接着执行这一条能看到数据,所以我估计你会再次燃起希望,接下来我们继续,让奇迹2出现吧:

2.3 完善一下

需要注意为了防止出错执行下面的步骤要确保MongoDB版本不小于3.2(因为3.2版本才是基于WiredTiger2.7构建的)。

mongodump
mongorestore --drop

没错就是这么简单,接下来我们就可以验证奇迹了。

mongo
> show dbs
> use Recovery
> show collections
> db.brokedCollection.count()
> db.brokedCollection.find({},{_id:1})

这次都回来了吧,一切正常了吧……接下来可以restore到任何你想要restore的地方了,如何使用可自由发挥。

3 收工

收工吧,累死了。

也许你已经受到上面步骤的启发想到更多有意思的恢复方法了,然而人生苦短,适可而止……

MongoDB使用建议

对重要数据库所在机器操作前一定要提前backup一下,把万万没想到的损失降到最低;还有,除非真的不care数据的高可用性,不要随便关journal;单台机器上有多个库的话最好在配置文件中设置下directoryPerDB:true,让每个库有一个单独文件夹;有富余机器的话尽量做一下复制集……

使用Wiredtiger恢复MongoDB中collection-x-xxx.wt文件数据相关推荐

  1. MongoDB中如何优雅地删除大量数据

    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 表的数据量到达一定 ...

  2. 怎样恢复回收站中已被删除的文件

    删除文件是很简单的,可以通过快捷键删除或者拖到回收站中都是删除.而通常这些文件都还在回收站中可以恢复,但如果我们一键清空了回收站,才发现有自己误删了重要文件呢.该怎样恢复回收站中已被删除的文件呢?有需 ...

  3. 计算机系统如何禁止删除文件,如何防止恢复电脑中被回收站删除的文件|彻底删除电脑中的文件的方法...

    ‍ 在电脑系统中要删除文件的话,一般是先将文件删除到回收站中,然后再删除回收站中的文件.但是这样并不能彻底删除文件,因为可以通过其他软件恢复被删除的文件.因此,对于一些秘密的重要文件,建议使用本教程中 ...

  4. fn_dblog_如何使用fn_dblog和fn_dump_dblog直接在SQL Server数据库中连续读取事务日志文件数据

    fn_dblog 大纲 (Outline) In this article, we'll discuss how to read SQL Server transaction logs. This a ...

  5. Java中使用renameTo方法导致文件数据缺失

    开发的时候发现了es里面数据有缺失,排查了好久,最后怀疑是renameTo方法的时候,在renameTo还没有完成的时候,程序就对生成的文件进行了处理,实际上这个时候文件还没有完全进入目标文件夹 这完 ...

  6. kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

    每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入 ...

  7. MongoDB中_class字段的作用

    我们知道,如果你用Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段,那这个字段是干嘛用的呢?我们可以不可以不要这个字段呢? 直接上结论 ...

  8. mongodb中cron定时任务

    需求: 每天定时清除mongodb中某一天之前的数据 思路: 采用shell脚本调用mongodb的命令执行js脚本即可. 步骤: 1.编写email.js文件,作用:清除mongodb某天之前数据, ...

  9. MongoDB在58同城百亿量级数据下的应用实践

    58同城作为中国最大的生活服务平台,涵盖了房产.招聘.二手.二手车.黄页等核心业务.58同城发展之初,大规模使用关系型数据库(SQL Server.MySQL等),随着业务扩展速度增加,数据量和并发量 ...

最新文章

  1. Spring Boot下的Redis缓存实战
  2. 【Python】7种方案,彻底实现可视化图片大小/分辨率控制自由
  3. ed是什么梗_花泽香菜不笑了什么梗怎么回事?花泽香菜为什么是宅男女神?
  4. Django 2.0 学习(20):Django 中间件详解
  5. 【算法系列之十二】最接近的三数之和
  6. 如何网络监测其他计算机关闭445端口,关闭445端口的方法,小编告诉你电脑如何关闭445端口-站长资讯中心...
  7. C++ Primer 第五版 第6章 6.2——函数参数传递阅读笔记
  8. U盘的用法用途与维护
  9. 军事方面的软件系统与瀑布模型
  10. qt designer 信号与槽_Qt信号与槽,一直无法执行自定义槽函数,是什么原因
  11. 记某站被搜索引擎入侵
  12. paip.python错误解决14
  13. Android Activity生命周期以及LoCat的使用
  14. UnitySDK新接入记录
  15. 找出数组中其中最大的数及其下标
  16. 信号调理方法总结笔记
  17. ts没有与此调用匹配的重载
  18. css代码大全,方便保存
  19. #574. 火车票(railway)
  20. 你的电脑是如何识别色图的?

热门文章

  1. SSH The authenticity of host can’t be established Are you sure you want to continue connecting
  2. 计算机多媒体的结论,计算机多媒体对初中物理教学的应用
  3. 基于OpenCV的人脸 考勤系统
  4. 邂逅Flutter开发
  5. 运行adb 命令提示more than one device/emulator
  6. u盘电视测试软件,智能电视安装软件无法识别U盘怎么办?简单几招教你搞定!...
  7. FlexboxLayout全攻略(Google官方灵活实现流式布局控件)
  8. React-Native搭建Android平台(ZUCC智能终端与移动应用开发lab1)
  9. 树莓派 SPI,I2C,UART串行总线介绍
  10. nico和niconiconi dp详解