--oplog的应用
1.介绍
注意:这是replica set或者master/slave模式专用
在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过–oplogSizeMB参数修改).
位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
use local
db.oplog.rs.find().pretty()
it 下一页
{
"ts" : Timestamp(1637674044, 2),
"t" : NumberLong(1),
"h" : NumberLong("6978982869296884137"),
"v" : 2,
"op" : "c",
"ns" : "config.$cmd",
"ui" : UUID("f31d7b7f-a2d5-4f65-9e05-a9c43f5d8e7f"),
"wall" : ISODate("2021-11-23T13:27:24.059Z"),
"o" : {
"create" : "system.sessions",
"idIndex" : {
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "config.system.sessions"
}
}
我们主要关注的就是op 后边的参数
"op" : "n"
"o" :
"i": insert
"u": update
"d": delete
"c": db cmd
i插入
u更新
d删除
c drop
根据这个来查找 ts:Timestamp
这个就类似于gtid也是唯一的,幂等性
test:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)
根据的自己的实际情况,这样117小时就会自动的清空,覆盖。所以备份的时间需要自己掌握好
2. oplog 配合mongodump实现热备
全备
mongodump --port 28017 --oplog -o /mongodb/backup
恢复
mongorestore --port 28017 --oplogReplay /mongodb/backup
2.1 案列
登录到主节点进行操作
模拟数据
mongo --port 28018
use wo
for(var i = 1 ;i < 20; i++) {
db.ci.insert({a: i});
}
全备
mongodump --port 28018 --oplog -o /mongodb/backup
–oplog功能:在备份同时,将备份过程中产生的日志进行备份
再次模拟数据
use wo
db.ci1.insert({id:1})
db.ci2.insert({id:2})
数据的删除
db.ci.drop()
show tables;
备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/backup
截取oplog并恢复到drop之前的位置
更合理的方法:登陆到原数据库
use local
db.oplog.rs.find({op:"c"}).pretty();
{
"ts" : Timestamp(1637992347, 1),
"t" : NumberLong(3),
"h" : NumberLong("-132933563836132105"),
"v" : 2,
"op" : "c",
"ns" : "wo.$cmd",
"ui" : UUID("79c8b5f9-be5f-4b53-b523-c64ac99d589c"),
"wall" : ISODate("2021-11-27T05:52:27.072Z"),
"o" : {
"drop" : "ci"
}
}
获取到oplog误删除时间点位置:
"ts" : Timestamp(1637992347, 1),
恢复备份+应用oplog
cd /mongodb/backup/local/
ls
oplog.rs.bson oplog.rs.metadata.json
cp oplog.rs.bson ../oplog.bson
rm -rf /mongodb/backup/local/
mongorestore --port 28018 --oplogReplay --oplogLimit "1637992347:1" --drop /mongodb/backup/
恢复成功
my_repl:PRIMARY> use wo
switched to db wo
my_repl:PRIMARY> show tables
ci
ci1
ci2
**分片集群的备份思路(了解)
1、你要备份什么?
config server
shard 节点
单独进行备份
2、备份有什么困难和问题
(1)chunk迁移的问题
人为控制在备份的时候,避开迁移的时间窗口
(2)shard节点之间的数据不在同一时间点。
选业务量较少的时候