mongodb journal文件格式(不错)
如果开启journal,在dbpath选项指定的目录下会创建journal目录来存放journal文件,文件名形如j._<n>。journal文件用于数据库异常退出时恢复数据。这里是解析journal文件的示例代码。
journal文件的大小定义如下,smallfiles选项可以指定为128M。
journal文件什么时候会被删除?
- 数据库正常退出时,全部删除。
- 对于老的journal文件,如果lastEventTimeMs < _lastFlushTime + ExtraKeepTimeMs,则删除。其中lastEventTimeMs为journal文件关闭的时间,_lastFlushTime为数据文件刷入到磁盘的时间,ExtraKeepTimeMs为额外的保留时间。
- 执行fsync命令
journal文件存储的是对数据库文件(dbname.ns、dbname.<#>系列文件)的修改日志,包括写操作和创建文件操作。对数据库文件的写操作会记录一个WriteIntent,创建数据库文件会记录一个DurOp。WriteIntent记录了写操作的指针和长度,可以定位到修改的数据文件的位置和长度。DurOp由一个操作码来确定是什么操作,不同的操作,日志的格式不一样。每个WriteIntent或者DurOp都会形成一个JEntry。
journal文件由一个头部JHeader和很多Section组成,每次groupCommit都会产生一个Section。Section由一个头部JSectHeader、很多个JEntry和一个JSectFooter组成,每个JEntry代表一条修改日志。另外,JEntry前面可能会有一个JDbContext,表示修改的是哪个数据文件。如果多个JEntry都是同一个数据文件的操作,则只有一个JDbContext。除掉JSectHeader 和JSectFooter ,Section中间那部分会压缩。
JHeader
beginning header for a journal/j._<n> file
there is nothing important int this header at this time. except perhaps version #.
char magic[2] | "j\n". j means journal, then a linefeed, fwiw if you were to run "less" on the file or something... |
unsigned short _version | 0x4149 |
char n1 | '\n' |
char ts[20] | ascii timestamp of file generation. for user reading, not used by code. for example: "Jan 29 14:14:23" |
char n2 | '\n' |
char dbpath[128] | path/filename of this file for human reading and diagnostics. not used by code |
char n3, n4 | '\n', '\n' |
unsigned long long fileId | unique identifier that will be in each JSectHeader. important as we recycle prealloced files |
char reserved3[8026] | 8KB total for the file header |
char txt2[2] | "\n\n" at the end |
头部的大部分字段都是可读的,很直观,用文本文件打开可以看到。
JSectHeader
"Section" header. A section corresponds to a group commit.len is length of the entire section including header and footer.header and footer are not compressed, just the stuff in between.
unsigned _sectionLen | unpadded length in bytes of the whole section |
unsigned long long seqNumber | sequence number that can be used on recovery to not do too much work |
unsigned long long fileId | matches JHeader::fileId |
_sectionLen是unpadded的长度,每个Section都会填充对齐。
每个Section都会有一个seqNumber,其值是上次同步数据库文件到磁盘的服务器时间,会不断增长。LSNFile(文件名是lsn)里面也存储了一个seqNumber,含义是一样的。恢复数据的时候,如果Section的seqNumber小于LSNFile的seqNumber,则不需要恢复。
JEntry
an individual write operation within a group commit section. Either the entire section should be applied, or nothing. (We check the md5 for the whole section before doing anything on recovery.)
unsigned len | length in bytes of the data of the JEntry. does not include the JEntry header. 实际就是数据data的长度 |
OpCodes opcode | 此字段和上面len字段共用的。如果是对数据库文件的修改,则为长度len;否则为操作类型。 |
unsigned ofs | offset in file. 指的是被修改的数据文件的偏移量 |
int _fileNo |
high bit is set to indicate it should be the <dbpath>/local database. dbname.#文件中的数字,即#。
如果是dbname.ns文件,则值为0x7fffffff。高位bit为1表示是local库。
|
char data[] | 更新的数据 |
OpCodes的取值
OpCode_Footer | JSectFooter的sentinel字段的取值 |
OpCode_DbContext | JDbContext的sentinel字段的取值 |
OpCode_FileCreated | 表示创建pdfile的操作 |
OpCode_DropDb | 表示dropDb的操作,目前没有使用 |
这几个取值都很大,因为跟JEntry的len是共用,必须比可能的长度值大得多
事实上JEntry、JDbContext和JSectFooter的前4字节是含义是相同的。这样比较容易解析。
当JEntry为Op时,格式根据不同的Op而变化,如OpCode_FileCreated的格式为
OpCodes opcode | OpCode_FileCreated |
unsigned long long reserved1 | |
unsigned long long reserved2 | |
unsigned long long _len | size of file, not length of name |
RelativePath _p | 文件名的相对路径,以'\0'结尾的字符串 |
JDbContext
declares "the next entry(s) are for this database / file path prefix"
sentinel | 哨兵值,为了解析方便,为OpCode_DbContext |
file path | 库的相对路径,相对于dbpath,以'\0'结尾的字符串。for a filename a/b/c.3, file path() is "a/b/c" |
JSectFooter
group commit section footer. md5 is a key field.
unsigned sentinel | 哨兵值,为了解析方便,为OpCode_Footer |
unsigned char hash[16] | 除掉JSectFooter,整个Section的checksum |
unsigned long long reserved | |
char magic[4] | "\n\n\n\n" |
LSNFile
last sequence number. lsn文件。
unsigned ver | 为0,用以检查是否合法 |
unsigned reserved2 | |
unsigned long long lsn | last sequence number。值为数据库文件上次同步到磁盘的时间。 |
unsigned long long checkbytes | lsn的值取反,用以检查是否合法 |
unsigned long long reserved[8] |
关注 - 0
粉丝 - 3
» 下一篇:mongodb持久化
mongodb journal文件格式(不错)相关推荐
- mongodb journal文件格式
如果开启journal,在dbpath选项指定的目录下会创建journal目录来存放journal文件,文件名形如j._<n>.journal文件用于数据库异常退出时恢复数据.这里是解析j ...
- mongodb journal占用磁盘处理
1.停止mongodb服务 service mongodb stop 或 kill -2 进程号 2.修改mongodb配置信息 vim /etc/mongodb.conf nojournal = t ...
- mongodb数据文件格式
mongodb的数据文件存在dbpath选项指定的目录里.每个库(database)都有一系列的文件:dbname.ns, dbname.0, dbname.1, ...数据文件也叫pdfile,意思 ...
- mongodb journal
how mongodbs journaling works I was working on a section on the gooey innards of journaling for The ...
- rails采用MongoDB感觉相当不错!
couchdb似乎出来早些,已经有书了.不过对比之下感觉mongo的安装简单些,只需要三个命令. 今天对照这个教程,比较顺利,感觉对rails的开发简化不少.数据库真的很烦人. mongo+mongo ...
- MongoDB 3.0 WiredTiger Compression and Performance
MongoDB3.0中的压缩选项 在MongoDB 3.0中,WiredTiger为集合提供三个压缩选项: 无压缩 Snappy(默认启用) – 很不错的压缩,有效利用资源 zlib(类似gzip) ...
- Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...
- SQL与NoSQL的区别 以MySQL与MongoDB为例
异同对比 1.语言和结构层面 SQL数据库,是基于表的,并且用结构化语言也就是SQL来定义和操纵数据.一方面,这是非常强大的:SQL是最通用和最广泛使用的选项之一,使其成为一个安全的选择,尤其适用于复 ...
- mysql和mongodb配合_MongoDB和Mysql怎样结合
二者结构有何不同? SQL中的许多概念都与MongoDB的文档结构相关.让我们来看一个简单的MongoDB环境结构,以更好地了解MongoDB的布局. 下面的图表涉及MySQL与MongoDB的不同点 ...
最新文章
- worktools-源码下拉问题
- 如何轻松学习 Kubernetes?
- 哪种修复redis未授权访问漏洞的方法是相对不安全的_关于Linux挖矿、DDOS等应急事件处置方法...
- Algorithm Master Road:算法的时间/空间复杂度
- Cloud for Customer UI designer自动生成的一些模型
- 贪吃蛇程序 php,微信小程序-贪吃蛇教程实例
- php的c方法,thinkphp的c方法的使用
- 年货节页面PSD分层模板,拿稳了!应急!
- XP停止服务,共建网络安全大环境
- php 和new date,将JavaScript new Date()转换为php DateTime()
- Java-IO流-实例
- python socket编程实例代码(含服务端和客户端)
- 通过VScode进行git的版本管理
- 2022年阿里云域名备案流程亲测及注意事项
- noi linux 默认密码,安装NOI Linux
- Python批量自定义文件夹图标
- 游戏渠道SDK是什么
- DML、DDL、DCL、CRUD指什么?
- Python爬虫实战详解:爬取图片之家
- 简单聊聊HDFS RBF第二阶段工作近期的一些进展
热门文章
- Miui13-mi10s刷twrp和Magisk
- humanoid 动画鬼畜的问题
- 免疫沉淀常见问题解答 | MedChemExpress
- 干货|对于软件产品质量的一些思考
- SylixOS 经得起检验的国产操作系统 (四)
- 永磁同步电机控制系列
- 程序底层工具:cl编译器
- aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...
- 杭电ACM-LCY算法进阶培训班-专题训练09
- 光纤交换机 序列号_交换机 获取S系列交换机序列号