最新消息:

MongoDB增量备份

IT技术 ipcpu 2745浏览

MongoDB增量备份.md

概述

MongoDB副本集有oplog用来主备同步,增量备份就是对指定时间段的oplog进行dump,然后在某个全量备份基础上进行回放,原理和MySQLbinlog增量备份一致。

OPlog

Oplog是一种特殊的Capped collections,特殊之处在于它是系统级Collection,记录了数据库的所有操作,集群之间依靠Oplog进行数据同步。Oplog的全名是local.oplog.rs,位于local数据下。

Oplog记录的操作记录是幂等的(idempotent),这意味着你可以多次执行这些操作而不会导致数据丢失或不一致。

这里我们简单介绍下oplog的格式

{"ts":{"$timestamp":{"t":1541685325,"i":2}},"t":{"$numberLong":"11"},"h":{"$numberLong":"169245588685612356"},"v":2,"op":"u","ns":"iip_shard.qasprope
rties","o2":{"_id":{"$oid":"5be2647ff3e24f580d732aec"}},"o":{"$set":{"officialReadAt":{"$date":"2018-11-08T13:55:25.516Z"}}}}

字段内容如下,

ts:操作发生时的时间戳,这个时间戳包含两部分内容t和i,t是标准的时间戳(自1970年1月1日 00:00:00 GMT 以来的毫秒数)而i是一个序号,目的是为了保证 t 与 i 组合出的 Mongo 时间戳 ts 可以唯一的确定一条操作记录
op:操作类型,插入对应i;更新对应u;删除对应d;但有一种情况是n,它表示无操作(no-op),紧紧代表一个消息信息。
ns:这个操作的库和collection的组合
o与o2:他们都是操作相关的数据内容

对于不同的版本的MongoDB,其oplog的格式也不一样,这点需要格外注意(此文使用的版本是3.4.0)。

Timestamps格式详解

MongoDB有一种特殊的时间格式Timestamps,仅用于内部使用,例如上面Oplog记录:

Timestamp(1503110518, 1)

Timestamps长度为64位:

前32位是time_t值,表示从epoch时间至今的秒数
后32位是ordinal值,该值是一个顺序增长的序数,表示某一秒内的第几次操作

增量导出数据

了解了数据结构,我们可以执行dump导出相关的数据了,如下,

 mongodump --port 27018 -d local -c oplog.rs -o dump --query "{ts : { \$gte : { \$timestamp : { t : 1519869600, i : 1 } }, \$lte : { \$timestamp : { t : 1519956000, i : 1 } } }} "

##@@取出1519869600到1519956000之间的oplog

TIPS:导出的bson文件可以使用命令bsondump oplog.rs.bson 转换成JSON格式。

回放OPlog

mongorestore --port 27018 -d local -c oplog.rs oplog.bson

参考资料

https://github.com/journeyapps/mongo-oplog-backup/blob/master/lib/mongo_oplog_backup/backup.rb
https://cloud.tencent.com/developer/article/1128027

转载请注明:IPCPU-网络之路 » MongoDB增量备份