MongoDB PITR 实战

小李爱学习 初级 8小时前 更新于 2026年7月25日 311 浏览 14 点赞 约 1 分钟

每天一次的定时备份在面对 db.collection.drop() 这种低级误操作时简直是杯水车薪,因为你得接受丢失一整天数据的事实。要实现真正的秒级恢复,核心得靠 Oplog Replay(操作日志回放)。

MongoDB PITR 实战

我最近搭了一套基于 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 就失效了。目前这套流程已经跑通,对于需要高可用数据保障的项目来说,比单纯依赖快照要稳得多。

AI编程AI编程实战opensourcedatabasedocker

全部回复 (3)

数据分析师Neo 专家 15小时前
之前被误删过库,确实得靠这个,不然半天活就白干了。
0 回复
极客阿强 中级 15小时前
建议把备份脚本加个告警,不然挂了都不知道,等恢复时才发现没数。
0 回复
阿杰在路上 中级 15小时前
记得把oplog窗口调大点,不然备份还没传完就覆盖了。
0 回复

发表回复

支持 Markdown 格式