mongodb增量备份需要搭建mongo副本集集群。通过hidden节点同步主节点的数据并生成oplog操作日志;全量备份+增量oplog备份实现任意时间点还原。其中hidden节点只负责备份数据不会成为主节点。

创建docker network

docker network create test

创建mongo容器

docker run -itd --name test1 --network test mongo mongod --replSet rs0 --bind_ip_all
docker run -itd --name test2 --network test mongo mongod --replSet rs0 --bind_ip_all
docker run -itd --name test3 --network test mongo mongod --replSet rs0 --bind_ip_all

进入mongo容器

docker exec -it test1 bash
mongo

初始化副本集,1个主节点,2个hidden节点

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "test1:27017" },
      { _id: 1, host: "test2:27017", "hidden" : true,"priority" : 0 },
      { _id: 2, host: "test3:27017", "hidden" : true,"priority" : 0}
   ]
})

插入一些数据并删除一些数据

use test
db.test.insert({name: "hello world1"})
db.test.insert({name: "hello world2"})
db.test.insert({name: "hello world3"})
db.test.remove({name: "hello world3"})

此时,数据库只有2条数据。

全量备份数据库

mongodump --oplog -o dump

增量备份oplog.rs集合

mongodump -d local -c oplog.rs -o dump2

把增量备份的oplog.rs.bson文件覆盖到全量备份的oplog.bson文件

mv dump2/local/oplog.rs.bson dump/oplog.bson

查询oplog.rs集合的操作日志

use local
db.oplog.rs.find({"ns": "test.test"}).sort({"$natural": -1})

得到以下操作日志

{ "op" : "d", "ns" : "test.test", "ui" : UUID("013571ff-aa92-4b10-88ce-de9bb63a0a15"), "o" : { "_id" : ObjectId("60588aa821dbf2ba72697d15") }, "ts" : Timestamp(1616415435, 1), "t" : NumberLong(1), "wall" : ISODate("2021-03-22T12:17:15.135Z"), "v" : NumberLong(2) }
{ "op" : "i", "ns" : "test.test", "ui" : UUID("013571ff-aa92-4b10-88ce-de9bb63a0a15"), "o" : { "_id" : ObjectId("60588aa821dbf2ba72697d15"), "name" : "hello world3" }, "ts" : Timestamp(1616415400, 1), "t" : NumberLong(1), "wall" : ISODate("2021-03-22T12:16:40.575Z"), "v" : NumberLong(2) }
{ "op" : "i", "ns" : "test.test", "ui" : UUID("013571ff-aa92-4b10-88ce-de9bb63a0a15"), "o" : { "_id" : ObjectId("60588aa621dbf2ba72697d14"), "name" : "hello world2" }, "ts" : Timestamp(1616415398, 1), "t" : NumberLong(1), "wall" : ISODate("2021-03-22T12:16:38.063Z"), "v" : NumberLong(2) }
{ "op" : "i", "ns" : "test.test", "ui" : UUID("013571ff-aa92-4b10-88ce-de9bb63a0a15"), "o" : { "_id" : ObjectId("60588a9921dbf2ba72697d13"), "name" : "hello world1" }, "ts" : Timestamp(1616415385, 2), "t" : NumberLong(1), "wall" : ISODate("2021-03-22T12:16:25.190Z"), "v" : NumberLong(2) }

可以查出ns是操作的集合。op是执行的操作;i代表插入,d代表删除。最新一条操作为删除操作且时间戳为Timestamp(1616415435, 1)

执行操作回放,插销删除数据操作。

mongorestore --oplogReplay --oplogLimit=1616415435:1 --dir dump

再次查询数据

use test
db.test.find()

得到以下结果

{ "_id" : ObjectId("60588a9921dbf2ba72697d13"), "name" : "hello world1" }
{ "_id" : ObjectId("60588aa621dbf2ba72697d14"), "name" : "hello world2" }
{ "_id" : ObjectId("60588aa821dbf2ba72697d15"), "name" : "hello world3" }

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐