家喻户晓MongoDB的底层存储是由WiredTiger负责的,其数据文件也是.wt格局。既然如此,咱们就有可能不通过MongoDB服务,而是间接用wt工具从数据文件中复原数据。尽管咱们通常举荐生产环境肯定要配置复制集,然而很无奈,技术社区曾经数次有人因为单机运行,最初硬盘损坏等起因导致无奈启动。wt工具作为最初一根稻草,能够在放弃医治前再尝试解救一下。
编译
wt工具能够运行于Linux和Windows上。因为各自的操作系统和MongoDB版本不同,可能产生较多的组合。在应用时应该依据本人状况编译适宜的版本。上面以CentOS 7为例演示编译过程。
1.装置操作系统依赖
sudo yum install -y epel-release libtool automake snappy snappy-devel lz4 lz4-devel zstd zstd-devel libzstd-devel zlib zlib-devel git make vim-common
2. 筹备源码
git clone https://github.com/wiredtiger/wiredtiger.git
依据所应用的MongoDB版本,应该抉择正确的wt分支。例如我以后应用的MongoDB 4.4.1,那么同样应该抉择WiredTiger的相应tagmongodb-4.4.1
> git tag | grep 4.4.1mongodb-4.4.1mongodb-4.4.1-rc0mongodb-4.4.1-rc1mongodb-4.4.1-rc2mongodb-4.4.1-rc3mongodb-4.4.10mongodb-4.4.10-rc0mongodb-4.4.11-rc0> git checkout tags/mongodb-4.4.1 -b v4.4.1
3. 编译源码
sh autogen.sh./configure --disable-shared --with-builtins=lz4,snappy,zlib,zstdmake -j $(nproc)make install
简略起见咱们应用了--disable-shared来将动态链接库间接打包到执行文件中,这样能够防止很多后续的麻烦,代价是生成的执行文件较大。
编辑数据
如果有幸dbpath中的其余文件没有失落,包含:
WiredTiger*
要复原的汇合的collection-xxx.wt
与要复原汇合相干的index文件
则能够间接应用wt工具复原数据了:
wt dump file:collection-10--2280053313118266952.wt
不过,如果所有货色都还在的话,为什么还要用wt来复原呢?所以我置信大部分人到这里都是跑不上来的。所以来看下一步,当你丢到只剩个裤衩子的时候该怎么办。
数据恢复
wt读取数据的根本前提条件是要有元数据,也就是WiredTiger*那堆文件。那咱们就来尝试结构这些文件:
mkdir tempcd temptouch WiredTiger WiredTiger.lockwt list
为了简略起见,后续步骤咱们没有应用wt来实现,而是应用MongoDB:
mongod --dbpath ./
启动另一个窗口,应用mongo shell连贯到以后实例:
mongo
任意创立一个汇合,咱们将把数据恢复到这个汇合中:
db.dump.insert({x: 1});db.dump.stats().wiredTiger.uri# statistics:table:collection-7-666354062479792805
collection-7-666354062479792805.wt即咱们要应用的指标文件名。此时应:
进行mongod(间接ctrl-c)
应用咱们要复原的文件笼罩上述文件
cp collection-10--2280053313118266952.wt collection-7-666354062479792805.wt
让wt帮咱们修复文件:
wt salvage file:collection-7-666354062479792805.wt
重启mongod过程:
mongod --dbpath ./
再次应用shell连贯到MongoDB,在dump汇合中即可找到咱们要复原的数据。
留神此时汇合数据尽管恢复正常,但如果你count()就会发现返回后果是1。不必放心,这个问题很容易修复:
db.dump.validate({full: true});
上面该怎么办大家心里有数了吗?
对于作者:张耀星
MongoDB大中华区首席征询参谋,供职于MongoDB售后服务团队5年+,领有近10年MongoDB应用教训。