跳到主要内容

第6章 MongoDB模拟误删除

模拟误删库恢复

前提

1.只有副本集才会有oplog
2.oplog保存在local库里
3.mongodump的时候,默认不备份local库

模拟场景

1
2
3
全备
4
5
6
drop databases

准备数据

use backup
db.backup.insertOne({"id":1})
db.backup.insertOne({"id":2})
db.backup.insertOne({"id":3})

全备数据库

rm -rf mongo_backup/
mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -o mongo_backup

写入增量数据

use backup
db.backup.insertOne({"id":4})
db.backup.insertOne({"id":5})
db.backup.insertOne({"id":6})

模拟误删除

use backup
db.dropDatabase()

备份oplog

mongodump --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" -d local -c oplog.rs -o mongo_backup

定位误删除操作的时间点

use local
db.oplog.rs.find({"ns" : "backup.$cmd"}).pretty()

找到误删除的位置点

"ts" : Timestamp(1587375719, 1)

截断oplog的drop时间点,然后恢复

cd mongo_backup
cp local/oplog.rs.bson oplog.bson
rm -rf local

mongorestore --host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019" --oplogReplay --oplogLimit=1587375719 mongo_backup --drop

生产中oplog配置多大

生产中需要设置多大?

1.差不多两个全备之间,相差时间内的数据量的大小
2.更改给定副本集成员的oplog大小或最小oplog保留期(在4.4中是新的)replSetResizeOplog不会改变副本集中任何其他成员的oplog大小。您必须replSetResizeOplog在集群中的每个副本集成员上运行,才能更改所有成员的操作日志大小或最小保留期限

官网地址

https://docs.mongodb.com/manual/core/replica-set-oplog/index.html
https://docs.mongodb.com/manual/reference/command/replSetResizeOplog/#dbcmd.replSetResizeOplog

相关命令

db.printReplicationInfo()
db.getReplicationInfo()

use admin
db.adminCommand(
{
replSetResizeOplog: 1,
size: 2048,
minRetentionHours: 24
}
)

更新: 2025-01-18 12:00:31