利用mongodb的oplog进行对库进行增量备份

单MongoDB实例开启Oplog,配置副本集,并进行增量备份

实验环境
system:CentOS Linux release 7.7.1908 (Core)
mongo:v4.0.0
开启权限验证环境

oplog详细介绍
oplog官方介绍
oplog的概念
oplog(operations log)是一个特殊的上限集合,它保存了修改存储在数据库中的数据的所有操作的滚动记录。 MongoDB 在主上应用数据库操作,然后在主要的 oplog 上记录操作。然后次要成员在异步 process 中复制并应用这些操作。所有副本集成员都在local.oplog.rs集合中包含 oplog 的副本,这允许它们维护数据库的当前 state。

为了便于复制,所有副本集成员都会向所有其他成员发送心跳(ping)。任何次要成员都可以 import 来自任何其他成员的 oplog 条目。

oplog 中的每个操作都是幂等。也就是说,无论是对目标数据集应用一次还是多次,oplog 操作都会产生相同的结果

配置副本集开启oplog
Starting in MongoDB 4.0, unlike other capped collections, the oplog can grow past its configured size limit to avoid deleting the majority commit point.

1.先stop服务
2.再配置mongodb1.conf

vim /usr/local/mongodb/bin/mongodb1.conf
replSet=rs0#添加这个参数,rs0为副本集的名字

如果yml形式的配置文件则

replication:   #注意需要把replication的#注释掉
   oplogSizeMB: 1024
   replSetName: rs

3.启动服务
4.切入mongo的shell环境中切入到admin库,执行如下命令

config={"_id" : "rs0","members" : [{"_id" : 0,"host" : "localhost:27017"}]}
rs.initiate(config)

返回{ “ok” : 1 }即可表示开启oplog成功
5.这个时候就可以切换到local数据库下,用show tables,可以看到oplog.rs表了

6.查看oplog的信息

db.printReplicationInfo()
configured oplog size:   990MB
log length start to end: 17494secs (4.86hrs)
oplog first event time:  Wed Jan 08 2020 14:47:12 GMT+0800 (CST)
oplog last event time:   Wed Jan 08 2020 19:38:46 GMT+0800 (CST)
now:                     Wed Jan 08 2020 19:38:47 GMT+0800 (CST)

configured oplog size: oplog文件大小
log length start to end: oplog日志的启用时间段
oplog first event time: 第一个事务日志的产生时间
oplog last event time: 最后一个事务日志的产生时间
now: 现在的时间

  1. oplog.rs集合的结构
{
	"ts" : Timestamp(1578466032, 1),
	"h" : NumberLong("-7596987247570694637"),
	"v" : 2,
	"op" : "n",
	"ns" : "",
	"wall" : ISODate("2020-01-08T06:47:12.422Z"),
	"o" : {
		"msg" : "initiating set"
	}
}
  • ts: 8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary
  • op:1字节的操作类型(“i”: insert,“u”: update,“d”: delete,“c”: db cmd,“db”:声明当前数据库(其中ns 被设置成为=>数据库名称+ ‘.’),“n”: no op,即空操作,其会定期执行以确保时效性
  • ns:操作所在的namespace
  • o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
  • o2: 在执行更新操作时的where条件,仅限于update时才有该属性

增量备份(这里实验我们只对整个库进行实验,当然它也是允许对单个库进行增量备份和还原的)
1.增量备份是相对应所有库的,不支持对单库进行增量备份

2.在增量备份前,必须要检查是否存在了对所有库的一次全量备份,如果没有,则需要先进行一次所有库的全量备份

mongodump --host 127.0.0.1 --port 27017 -uadmin -p123 --oplog --authenticationDatabase "admin" --out /data/dump/20200107

3.插入几条数据

4.获取上次全量备份时oplog的时间戳

bsondump /data/dump/20200107/oplog.bson

5.接下里既可以开始执行增量备份命令

mongodump -u admin -p 123 --host localhost --port 27017  -d local -c oplog.rs -q '{ts:{$gt: Timestamp(1578475955, 1)}}' -o /data/dump/inc/ --authenticationDatabase admin

增量的恢复

1.我们可以将刚刚新增的集合给删除,然后来验证

2.先恢复全量

mongorestore --host 127.0.0.1 --port 27017 --authenticationDatabase admin -uadmin -p123 --drop --oplogReplay /data/dump/20200107/

3.再恢复增量

mongorestore --host 127.0.0.1 --port 27017 --authenticationDatabase admin -uadmin -p123 --drop --oplogReplay /data/dump/inc/local/oplog.rs.bson

4.检查增量的数据是否正常恢复

需要注意的是由于oplog是一个循环写入的集合,当超过设置的大小就会覆盖最初的写入

猜你喜欢

转载自blog.csdn.net/mingtiannihaoabc/article/details/103897217