mongodb 增量备份
创建docker networkdocker network create test创建mongo容器docker run -itd --name test1 --network test mongo mongod --replSet rs0 --bind_ip_alldocker run -itd --name test2 --network test mongo mongod --replSe
·
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" }
更多推荐
已为社区贡献1条内容
所有评论(0)