MongoDB PITR 实战
每天一次的定时备份在面对
下一篇
浏览器鼠标回报率测试:实测数值为什么总在跳? →
db.collection.drop() 这种低级误操作时简直是杯水车薪,因为你得接受丢失一整天数据的事实。要实现真正的秒级恢复,核心得靠 Oplog Replay(操作日志回放)。我最近搭了一套基于 Docker 和 Google Drive 的 PITR(Point-in-Time Recovery)系统,逻辑是利用 MongoDB 的 oplog 记录所有写操作,在需要回滚时,先恢复全量快照,再顺序重放 oplog 直到指定的时刻。
具体的实现链路如下:
一、环境配置
使用 Docker 部署 MongoDB 副本集(Replica Set),因为只有副本集模式才会开启 oplog。
services:
mongodb:
image: mongo:latest
command: mongod --replSet rs0
ports:
- "27017:27017"二、备份与回放流程
1. 全量快照:定期执行 mongodump 导出数据。
2. 增量同步:通过脚本持续监听并备份 oplog 到 Google Drive。
3. 精准还原:
- 部署一个临时 MongoDB 实例。
- 导入最近的一次全量快照。
- 使用 mongorestore --oplogReplay 配合 --oplogLimit 参数,将时间戳精确锁定在误删操作发生的前一秒。
# 示例:回放 oplog 到特定时间点
mongorestore --oplogReplay --oplogLimit <timestamp> /backup/oplog/这种方案最关键的点在于 oplog 的窗口大小,如果写入量极大,必须调大 oplogSizeMB,否则旧日志被覆盖后,PITR 就失效了。目前这套流程已经跑通,对于需要高可用数据保障的项目来说,比单纯依赖快照要稳得多。
