起因:一朋友的公司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

经网上查询后,可以直接通过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() 就可以正常显示恢复数据的条数了
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!