mongoDB 3.2.7 从.wt 文件中提取数据

起因:一朋友的公司mongdb使用的3.2.7的版本,由于硬件问题,导致恢复出来的文件缺少了 _mdb_catalog.wt ,mongodb不能正常启动,报如下错误: 2017-03-08T14:31:43.390+0800 E STORAGE  [inita...

起因:一朋友的公司mongdb使用的3.2.7的版本,由于硬件问题,导致恢复出来的文件缺少了 _mdb_catalog.wt ,mongodb不能正常启动,报如下错误:

2017-03-08T14:31:43.390+0800 E STORAGE  [initandlisten] WiredTiger (2) [1488954703:390513][5924:0x7f3e223d2c80], file:_mdb_catalog.wt, WT_SESSION.open_cursor: /webdata/opt/local/mongodb/data/_mdb_catalog.wt: handle-open: open: No such file or directory

启用了WiredTiger 引擎的mongdb,

_mdb_catalog.wt里存储了所有集合的元数据,包括集合对应的WT table名字,集合的创建选项,集合的索引信息等,WT存储引擎初始化时,会从_mdb_catalog.wt里读取所有的集合信息,并加载元信息到内存。

可以通过wt命令行直接dump出_mdb_catalog.wt里的内容查看,dump出的内容为BSON格式,阅读起来不是很方便。

shitian@docker:~/mongo/temp$ /usr/local/wiredtiger/bin/wt -C "extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]" -h. dump table:_mdb_catalog

attachments-2017-03-JzzVD3C158c12aed7bae

经网上查询后,可以直接通过wt命令行工具,从collections........wt 文件中提取数据文件,说干就干。

1,首先安装WiredTiger,这里选择最新版

 git clone https://github.com/wiredtiger/wiredtiger.git 

cd wiredtiger

2,安装相关依赖

sudo apt-get install -y autoconf  libtool libsnappy-dev build-essential

3,编译和安装

sudo ./configure --prefix=/usr/local/wiredtiger --enable-snappy

make && make install

4,开始通过wt命令从wt数据文件中恢复数据

经过测试,通过wt命令行工具直接从wt文件中恢复数据需要一些元数据文件辅助,这些文件分别是

WiredTiger ,WiredTiger.lock,WiredTiger.trutle,WiredTiger.wt 这四个文件(最少的保证)

这里假设要恢复的wt数据文件放在了/home/shitian/test 下面,文件名称为:collection-168-1316691561968341704.wt

通过营救命令可以恢复抓取可以恢复的数据

命令如下:

shitian@docker:~/test$ sudo /usr/local/wiredtiger/bin/wt -v -h /home/shitian/test -C "extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]" -R salvage collection-168-1316691561968341704.wt


5,把salvage的数据导出来

shitian@docker:~/test$ sudo /usr/local/wiredtiger/bin/wt -v -h /home/shitian/test -C "extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]" -R dump -f /home/shitian/mth.dump  collection-168-1316691561968341704.wt

6,因为导出的mth.dump 文件还不能为mongodb识别,不能导入到mongdb中,这里需要一个中间步骤,

假设mongdb 的数据目录存在 /home/shitian/mongdb/temp 下面

我们启动mongdb:

cd /home/shitian/mongdb;./bin/mongod --dbpath temp --storageEngine wiredTiger --nojournal &

通过客户端连接上mongdb

./bin/mongo

use mth #建立一个名字为“mth” 的库

db.huifu.insert({a: 1})  #在名为"huifu" 的集合中插入一条数据,顺便创建了huifu的集合

db.huifu.remove({})  # 删除上步中插入的数据,这里主要目的就是创建一个新的集合

db.huifu.stats() # 找到并记录下集合的名称

这里新建立集合名称为:collection-6--3222090996310833148


7,通过wt命令把刚才的mth.dump 数据导入到新创建的集合"huifu" 中

导入之前需要停掉mongdb服务,不然会提示集合busy


sudo /usr/local/wiredtiger/bin/wt -v -h /home/shitian/mongo/temp -C "extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]" -R load -f /home/shitian/mth.dump -r collection-6--3222090996310833148

注意这里 要导入的目录变成了mongdb dbpath指定的目录(/home/shitian/mongo/temp) 这也是集合"huifu" 所在的dbpath的路径

8,成功之后,通过db.huifu.find() 可以发现数据,但通过db.huifu.count() 还是显示为0,不要着急,想要显示正常统计,还需要进一步的操作

9,通过mongodump 导出上步恢复的数据

10,通过 mongorestore --drop 从新导入下,这时再使用db.huifu.count() 就可以正常显示恢复数据的条数了

  • 发表于 2017-03-09 18:02
  • 阅读 ( 65 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
石天
石天

437 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章