最牛MongoDB灾难恢复(WiredTiger.wt文件损坏,Mongo无法启动)
WiredTiger.wt文件是mongoDB的元数据文件,存储了其他数据库表的元数据信息。笔者最近遇到了WiredTiger.wt文件损坏的情况,MongoDB无法启动,数据库中的重要数据危在旦夕...
一、网上大多数文章的恢复方案 - 使用wt工具对数据进行打捞
由于笔者之前没有接触过MongoDB,对其知之甚少,只能参考网上的文章来试图恢复数据。看了下网上的文章,大多是说通过wt工具来打捞数据。然而wt工具打捞数据,需要WiredTiger.wt文件是完好可用,并不适用于笔者遇到的情形。
二、源码面前,了无秘密 - 读源码,直接从wt数据文件恢复数据
网上的恢复方案不对症,无奈只能另寻他法。
通过阅读wiredtiger的代码发现,wt数据文件中,数据库记录以bson格式存储的,并默认通过snappy进行了压缩,数据默认没有进行加密
1. wt数据文件结构分析
使用vim的十六进制模式观察collection*.wt数据文件发现:
- wt数据文件的前4096字节是该wt文件的元数据信息
- wt数据文件从4096开始存储数据库记录
- wt数据文件的记录对齐4096
把视线聚焦到单独的某个记录上:
0001000: 0000 0000 0000 0000 0100 0000 0000 0000 ................
0001010: 70e2 0000 0200 0000 0705 0000 0060 0000 p............`..
0001020: fa49 5207 0100 0000 0581 80e2 c1c2 42e2 .IR...........B.
0001030: 0000 105f 6964 0057 0000 0010 7573 6572 ..._id.W....user
0001040: 9454 0000 0000 0000 b0c4 0330 5f69 6400 .T.........0_id.
0001050: e6a2 675c 1074 6173 6b01 0df0 4402 0000 ..g\.task...D...
0001060: 0002 696d 6167 655f 6e61 6d65 002f 0000 ..image_name./..
0001070: 006c 796d 7068 5f6e 6f64 655f 6d69 6372 .lymph_node_micr
0001080: 6f73 636f 7065 5753 495f 3139 3032 3238 oscopeWSI_190228
0001090: 5f31 3930 3330 3839 3231 312e 7376 7300 _1903089211.svs.
00010a0: 1069 053f e869 6400 7f09 0000 026a 736f .i.?.id......jso
在wiredtiger源码中定义每个数据数记录的存储格式:
- 00 - 07 字节,recno,记录编号,关系不大
- 00 - 15 字节,write_generation
- 16 - 19 字节,记录解压后的size(记录默认是通过snappy压缩的),用于解压
- 28 - 31 字节,在源码没找到,但是通过观察,应该是该记录的存储size,对齐4096,用于记录读取
2. 记录读取及snappy解压
从记录头部读取头部64字节的数据,从而解析到:
- 记录解压后size,后文称 decompress_size
- 记录存储size,后文称 store_size
从记录开头读取 store_size 字节的数据,跳过WT_BLOCK_COMPRESS_SKIP字节,对其后数据进行snappy解压,解压后数据总大小应为 decompress_size 。
3. 从记录中提取bson格式的数据
记录解压后,前面的很多字节并不是bson的数据,笔者也没详细去看前面的字节到底是什么,而是通过一个巧办法暴力地提取了bson格式的数据。
bson格式的前4个字节是bson数据的size,后面的数据会以 类型、名称、值这样的形式存储,具体可参考网上关于bson格式解释的文章
0001000: 0000 0000 0000 0000 0100 0000 0000 0000 ................
0001010: 70e2 0000 0200 0000 0705 0000 0060 0000 p............`..
0001020: fa49 5207 0100 0000 0581 80e2 c1c2 42e2 .IR...........B.
0001030: 0000 105f 6964 0057 0000 0010 7573 6572 ..._id.W....user
数据库记录中有个 _id 这样的字段、该字段的类型为32位数值,在bson中该类型表示为 0x10,因此这个32位数值类型的_id,会存储为105f 6964。其中,10是类型,5f 6964是_id,其后的32位存储了它的实际数值。
由于_id是bson数据中的第一个字段,根据bson格式定义,105f 6964前面的4个字节 42e2 0000是bson数据的大小,也就是bson数据的起始位置。
通过该寻找105f 6964,可以定位到bson数据的起始位置,并将bson数据存储成bson文件,如xxx.bson
4. 使用bsondump来解析bson文件,得到数据
[root@h-100 ~]# bsondump xxx.bson
三、切记、切记
使用MongoDB时,像WiredTiger.wt这样重要并不大的文件,多做备份,避免不必要的麻烦
五、关注笔者
专注笔者公众号,阅读更多干货文章:)
最牛MongoDB灾难恢复(WiredTiger.wt文件损坏,Mongo无法启动)的更多相关文章
- mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】
====================================================== 标题遇到的问题是我要解决的问题的中间环节. 原本问题是:需要在之前standlone的Mo ...
- 记:cloudstack--gluster主存储上的一个文件损坏导致SSVM启动失败
cloudstack的系统vm(ssvm不停的重建失败).- 1.cloudstack-management 的关键日志 这行 cannot read header 'mnt.......':Inva ...
- 从损坏的wt文件中恢复出WiredTiger集合
Reference: http://dev.guanghe.tv/2016/06/recovering-a-wiredtiger-collection-from-a-corrupt-wt-file.h ...
- mongodb文件损坏的恢复--无可恢复数据
1.mongodb 启动异常error code 100,检查日志,数据文件损坏 2 检查collection-15-6548623434943640018.wt 可恢复数据,为空,不存在恢复的数据 ...
- (转)MongoDB 3.0 WT引擎参考配置文件
mongodb 3.0 改变很多,从2.6版本升级到3.0要关注的细节很多,如权限等等.3.0在数据存储引擎上更换成了wiredTiger,在数据压缩方面很有效,解决大数据量问题的情况下,磁盘不够用的 ...
- MongoDB 3.0 WT引擎参考配置文件
单实例: systemLog: destination: file ###日志存储位置 path: /data/mongodb/log/mongod.log logAppend: true stora ...
- MongoDB中WiredTiger的数据可用性设置
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB中WiredTiger的参数配置主要通过 wiredtiger_open (http://so ...
- 用nginx-gridFS读取MongoDB的图片及文件(为什么你老是配不成功?)
最近在部署公司服务器的nginx + mongodb + gridfs环境: 搜索了N多文档,基本上都一样,期间遇到很多问题: 下面是整理的一份搭建文档: 摘要 nginx-gridfs是一个ngin ...
- mongodb的mongod.lock文件及oplog文件
在mongodb的启动时,在数据目录下,会生成一个mongod.lock文件.如果在正常退出时,会清除这个mongod.lock文件,若要是异常退出,在下次启动的时候,会禁止启动,从而保留一份干净的一 ...
随机推荐
- 文件上传(bootstrap fileinput)
在做Excel文件上传和下载时,原生文件输入框太不美观,从网上找的bootstrap fileinput还是挺漂亮的, 需要引用的文件 //4.fileUpload bundles.Add(new S ...
- svm资料收集
向量点乘(内积)和叉乘(外积.向量积)概念及几何意义解读: https://blog.csdn.net/dcrmg/article/details/52416832 三角形余弦定理:https://z ...
- Git学习笔记(两)
删除文件 假设需要从Git删除文件,我们必须从删除列表中的跟踪文件(从临时区域中删除).然后提交.可以使用git rm工作订单完成.联合司令部从工作区删除指定的文件.以后就不会出如今未跟踪文件清单中. ...
- 构建自己的PHP框架(Redis)
完整项目地址:https://github.com/Evai/Aier Redis 简介 'Redis' 是一个高性能的 'key-value' 数据库,其 'value' 支持 'String'.' ...
- 关于禅道提示未安装VC++环境的问题(做个记录)
明明安装了VC++环境,总是提示未安装,这个问题有可能是你的mysql或其他服务开启影响的,关闭服务就可以了! 我这边是这个问题,把mysql和其他一些服务停止就好了.
- [转]更改ejs模板后缀.ejs为.html
三种写法 1,express老写法,3.*已经不支持 app.register('.html', require('ejs')); app.set('view engine', 'ejs'); 2, ...
- Centos上通过shell脚本实现数据库备份和还原
最近有个这样的需求,通过shell脚本实现数据库备份还原,最后通过网上查询自己测试实现,将脚本分享给大家 1.数据库备份脚本 #!/bin/bash ds=`` list=`date +%Y`/`da ...
- Android Xposed框架出现java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation问题
第一次玩Xposed框架,按照多个demo的格式写了一个demo发现死活不进入 public abstract void handleLoadPackage(LoadPackageParam lppa ...
- WPF:通过BitmapSource的CopyPixels和Create方法来切割图片
原文 WPF:通过BitmapSource的CopyPixels和Create方法来切割图片 BitmapSource是WPF图像的最基本类型,它同时提供两个像素相关的方法就是CopyPixels和C ...
- SignalR---服务端
原文:SignalR---服务端 前段时间把SignalR的官网教程大致看了一下,算是翻译了一遍,加上了自己的个人理解, 一下上传三个文件,分别是服务端.web客户端.DOTNET客户端相关文档,供大 ...