MongoDB oplog日志解释及实战恢复(3.6版本)
MongoDB-oplog日志(介绍):
注意:这是replica set或者master/slave模式专用
oplog介绍:
在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过–oplogSizeMB参数修改),位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
查看当前的oplog时间窗口预计值:(复制集-主节点)
rs.printReplicationInfo()
MongoDB-oplog日志(实战恢复):
oplog存放在local库,只能够在本地访问,mongos节点无法查看与操作
创建备份目录:(mongodb真实数据节点)
mkdir /tmp/backup
全量备份数据:(mongodb真实数据节点)
mongodump -h 10.0.0.10 --port 28017 --oplog -o /tmp/backup
mongodb数据操作:(mongodb真实数据节点)
mongo 10.0.0.10:28017/admin
use world
db.city1.insert({id:1})
db.city2.insert({id:2})
db.city.drop()
show tables;
备份本地oplog.rs表:(mongodb真实数据节点)
mongodump -h 10.0.0.10 --port 28017 -d local -c oplog.rs -o /tmp/backup/
截取oplog并恢复到drop之前的位置:(mongodb真实数据节点)
mongo 10.0.0.10:28017/admin
#查看操作为change的oplog
use local
db.oplog.rs.find({op:"c"}).pretty();
it #如果查询change操作日志太多,it 可以翻页
---------------------------------------------------------
#找到drop city表的Timestamp值
{
"ts" : Timestamp(1551436566, 2), <-------------------#Timestamp值(注意!!!)
"t" : NumberLong(12),
"h" : NumberLong("1619926712190147662"),
"v" : 2,
"op" : "c",
"ns" : "world.$cmd",
"ui" : UUID("45f54a7b-4d6c-4a53-bfad-e685645791b6"),
"wall" : ISODate("2019-03-01T02:36:09.239Z"),
"o" : {
"drop" : "city"
}
}
---------------------------------------------------------
cp /tmp/backup/local/oplog.rs.bson /tmp/backup/oplog.bson
rm -rf /tmp/backup/local/
恢复:(mongodb真实数据节点)
#查看oplog表找到的Timestamp值是逗号分隔,在恢复时手动修改为“冒号”
mongorestore -h 10.0.0.10 --port 28017 --oplogReplay --oplogLimit "1551436566:2" --drop /tmp/backup/
mongo 10.0.0.10:28017/admin