利用 Oplog 进行精确到秒的时间点恢复与回滚分析
讲解如何基于 MongoDB Oplog 实现自定义的增量备份和时间点恢复,包括如何从 Oplog 中提取特定时间窗口内的写操作,以及如何分析并回滚误操作。 · 难度:入门 · +10XP
利用 Oplog 进行精确到秒的时间点恢复与回滚分析
当 MongoDB 发生数据误删或误更新时,Oplog 是最后一道防线。本教程将展示如何通过 db.oplog.rs.find() 结合 $natural 排序和 limit 来获取指定时间区间内的操作记录,并使用 applyOps 命令将它们反向应用到目标集合中,实现精确到秒的回滚。此外,你还会学到如何通过 Oplog 窗口大小配置来平衡存储与可恢复时间范围,以及如何手动修剪 Oplog 以避免磁盘满。
const targetTime = ISODate('2024-08-20T14:30:00Z');
const ops = db.getSiblingDB('local').oplog.rs.find({
ts: { $gte: targetTime, $lt: new Date(targetTime.getTime() + 60000) },
ns: 'mydb.orders'
}).sort({ $natural: -1 }).toArray();
// 反转操作逻辑
const rollbackOps = ops.map(op => ({
op: op.op === 'i' ? 'd' : op.op === 'd' ? 'i' : 'u',
ns: op.ns,
o: op.op === 'u' ? op.o2 : op.o
}));
db.adminCommand({ applyOps: rollbackOps });