bson

最牛MongoDB灾难恢复(WiredTiger.wt文件损坏,Mongo无法启动)

谁说胖子不能爱 提交于 2020-12-21 20:34:47
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

将时间戳(timestamp)转换为MongoDB中的ObjectId

荒凉一梦 提交于 2020-11-25 09:23:05
文章目录 什么是ObjectId ObjectId的构造方法 ObjectId实例方法 ObjectId与Timestamp的转换 shell python javascript 什么是ObjectId ObjectId是MongoDB文档的默认主键,通常位于插入文档的_id字段中。例如: { "_id" : ObjectId ( "507f1f77bcf86cd799439011" ) } ObjectId是一个12字节的二进制BSON类型字符串, 由以下几部分构成: 1-4字节:UNIX时间戳 5-7字节:表示运行MongoDB的机器 8-9字节:表示生成此_id的进程 10-12字节:由一个以随机数为起始的计数器生成的值 ObjectId的构造方法 构造器ObjectId()接受的参数可以是: 不提供参数 var ObjectId = require ( 'mongodb' ) . ObjectID var id = new ObjectId ( ) ; 12字节的字符串 var ObjectId = require ( 'mongodb' ) . ObjectID var id = new ObjectId ( "aaaabbbbcccc" ) ; 24字节的16进制字符表示 var ObjectId = require ( 'mongodb' ) . ObjectID

java如何使用mongodb shell命令

 ̄綄美尐妖づ 提交于 2020-10-30 20:41:42
最近工作使用了mongodb数据库,一开始使用spring 中的 MongoTemplate api 来查询,发现很不直观,比较费劲,就想能否直接调用shell 命令。网上查了下,完整的例子很少,有的例子可能是版本不同不能使用。于是,参考网上资料,经过1小时的尝试,得出可行方法,直接上代码吧。 @Autowired MongoConverter mongoConverter; @Test public void mgTest(){ String a = "[ { \"$match\" : { \"content.userEvent\" : \"visited\"}} , { \"$group\" : { \"_id\" : \"$header.visit_bid\"}} , { \"$group\" : { \"_id\" : \"$_id.header.visit_bid\" , \"count\" : { \"$sum\" : 1}}}]"; JSONArray ja = JSON.parseArray(a); List<Bson> bsonList = new ArrayList<>(); for(int i=0;i<ja.size();i++){ bsonList.add(BsonDocument.parse(ja.get(i).toString())); } List

为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

青春壹個敷衍的年華 提交于 2020-10-27 16:47:21
B-树由来 定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。 先来看看为什么会出现B-树这类数据结构。 传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。 关于磁盘可参考 浅谈计算机中的存储模型(四)磁盘 上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。

为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

故事扮演 提交于 2020-10-05 07:07:21
B-树由来 定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。 先来看看为什么会出现B-树这类数据结构。 传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。 关于磁盘可参考 浅谈计算机中的存储模型(四)磁盘 上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。