使用Wiredtiger恢复MongoDB中collection-x-xxx.wt文件数据
目录
问题:
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.wt
、sizeStorer.wt
、storage.bson
、WiredTiger
、WiredTiger.basecfg
、WiredTiger.lock
、WiredTiger.turtle
、WiredTiger.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文件数据相关推荐
- MongoDB中如何优雅地删除大量数据
删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 表的数据量到达一定 ...
- 怎样恢复回收站中已被删除的文件
删除文件是很简单的,可以通过快捷键删除或者拖到回收站中都是删除.而通常这些文件都还在回收站中可以恢复,但如果我们一键清空了回收站,才发现有自己误删了重要文件呢.该怎样恢复回收站中已被删除的文件呢?有需 ...
- 计算机系统如何禁止删除文件,如何防止恢复电脑中被回收站删除的文件|彻底删除电脑中的文件的方法...
在电脑系统中要删除文件的话,一般是先将文件删除到回收站中,然后再删除回收站中的文件.但是这样并不能彻底删除文件,因为可以通过其他软件恢复被删除的文件.因此,对于一些秘密的重要文件,建议使用本教程中 ...
- 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 ...
- Java中使用renameTo方法导致文件数据缺失
开发的时候发现了es里面数据有缺失,排查了好久,最后怀疑是renameTo方法的时候,在renameTo还没有完成的时候,程序就对生成的文件进行了处理,实际上这个时候文件还没有完全进入目标文件夹 这完 ...
- kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入 ...
- MongoDB中_class字段的作用
我们知道,如果你用Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段,那这个字段是干嘛用的呢?我们可以不可以不要这个字段呢? 直接上结论 ...
- mongodb中cron定时任务
需求: 每天定时清除mongodb中某一天之前的数据 思路: 采用shell脚本调用mongodb的命令执行js脚本即可. 步骤: 1.编写email.js文件,作用:清除mongodb某天之前数据, ...
- MongoDB在58同城百亿量级数据下的应用实践
58同城作为中国最大的生活服务平台,涵盖了房产.招聘.二手.二手车.黄页等核心业务.58同城发展之初,大规模使用关系型数据库(SQL Server.MySQL等),随着业务扩展速度增加,数据量和并发量 ...
最新文章
- Spring Boot下的Redis缓存实战
- 【Python】7种方案,彻底实现可视化图片大小/分辨率控制自由
- ed是什么梗_花泽香菜不笑了什么梗怎么回事?花泽香菜为什么是宅男女神?
- Django 2.0 学习(20):Django 中间件详解
- 【算法系列之十二】最接近的三数之和
- 如何网络监测其他计算机关闭445端口,关闭445端口的方法,小编告诉你电脑如何关闭445端口-站长资讯中心...
- C++ Primer 第五版 第6章 6.2——函数参数传递阅读笔记
- U盘的用法用途与维护
- 军事方面的软件系统与瀑布模型
- qt designer 信号与槽_Qt信号与槽,一直无法执行自定义槽函数,是什么原因
- 记某站被搜索引擎入侵
- paip.python错误解决14
- Android Activity生命周期以及LoCat的使用
- UnitySDK新接入记录
- 找出数组中其中最大的数及其下标
- 信号调理方法总结笔记
- ts没有与此调用匹配的重载
- css代码大全,方便保存
- #574. 火车票(railway)
- 你的电脑是如何识别色图的?
热门文章
- SSH The authenticity of host can’t be established Are you sure you want to continue connecting
- 计算机多媒体的结论,计算机多媒体对初中物理教学的应用
- 基于OpenCV的人脸 考勤系统
- 邂逅Flutter开发
- 运行adb 命令提示more than one device/emulator
- u盘电视测试软件,智能电视安装软件无法识别U盘怎么办?简单几招教你搞定!...
- FlexboxLayout全攻略(Google官方灵活实现流式布局控件)
- React-Native搭建Android平台(ZUCC智能终端与移动应用开发lab1)
- 树莓派 SPI,I2C,UART串行总线介绍
- nico和niconiconi dp详解