Mongo数据备份以及恢复

标签: mongo  

MongoDB支持副本集,为何还需要备份呢?备份的主要目的有:1)防止硬件故障引起的数据丢失; 2)防止人为错误误删数据;3)时间回溯;4)监管要求。

MongoDB备份的机制

  1. 延迟节点备份
  2. 全量备份 + Oplog 增量

全量备份的方式

  1. mongodump

  2. 复制数据文件

  3. 文件系统快照

方案一:延迟节点备份

安全范围内的任意时间点状态 = 延迟从节点当前状态 + 定量重放 oplog

延迟备份注意事项

主节点的 oplog 时间窗t应满足: t >= 延迟时间 + 48小时

方案二:全量备份加 oplog

  • 最近的 oplog 已经在 oplog.rs 集合中,因此可以在定期从集合中导出便得到了 oplog;
  • 如果主节点上的 oplog.rs 集合足够大,全量备份足够密集,自然也可以不用备份 oplog;
  • 只要有覆盖整个时间段的 oplog,就可以结合全量备份得到任意时间点的备份。

复制数据库文件全量备份注意事项

  • 必须先关闭节点才能复制,否则复制到的文件无效;
  • 也可以选择 db.fsyncLock() 锁定节点,但完成后不要忘记 db.fsyncUnlock() 解锁;
  • 可以且应该在从节点上完成;
  • 该方法实际上会暂时宕机一个从节点,所以整个过程中应注意投票节点总数。

文件系统快照注意事项

  • MongoDB 支持使用文件系统快照直接获取数据文件在某一时刻的镜像;

  • 快照过程中可以不用停机;

  • 数据文件和 Journal 必须在同一个卷上;

  • 快照完成后请尽快复制文件并删除快照;

Mongodump 全量备份注意事项

  • 使用 mongodump 备份最灵活,但速度上也是最慢的;
  • mongodump 出来的数据不能表示某个个时间点,只是某个时间段

可以通过oplog的幂等性解决这个问题:

备份和恢复操作

几个重要参数:

mongodump:
--oplog: 复制 mongodump 开始到结束过程中的所有 oplog 并输出到结果中。 输出文件位于 dump/oplog.bson

mongorestore:
--oplogReplay: 恢复完数据文件后再重放 oplog。默认重放 dump/oplog.bson=> <dump-directory>/local/oplog.rs.bson。如果 oplog 不在这,则可以:
	--oplogFile: 指定需要重放的 oplog 文件位置
	--oplogLimit: 重放 oplog 时截止到指定时间点

举例:

mongodump -h 127.0.0.1:27017 --oplog

mongorestore --host 127.0.0.1 --oplogReplay dump

参考:

mongodump – MongoDB Manual

mongorestore – MongoDB Manual

bsondump – MongoDB Manual

「真诚赞赏,手留余香」

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章