我们如何每小时备份 oplog 并在 mongodb 的完整备份上应用

use*_*930 6 mongodb

我们有完整的 lvm 快照备份。我们正在尝试每小时进行一次 oplog 备份并保存为文件。如果需要,我们喜欢在完整备份之上应用 oplog 备份。我们想知道如何做到这一点。我们每天都在进行 LVM 快照完整备份。我们的 Oplog 是 80GB,可以容纳 30 天的 oplog。但是我们面临着应用它的问题。我可以每小时进行一次 oplog 备份。但问题是:如何应用它?我们不想要重复或任何丢失的数据。

Ada*_*m C 4

oplog是幂等的,您可以根据需要多次运行其中的操作,并且不会出现重复或问题,除非您在一组处于奇怪状态的数据文件上运行操作

但是,应该注意的是,只要您将日志作为 LVM 快照的一部分,就不需要重新运行 oplog 来实现一致备份。

话虽如此,如果您确实有 oplog 的副本,则可以通过两种方式“重放”它:

  1. 启动一个新的 MongoDB 实例,使用它来访问 oplog 备份,然后创建一个自定义脚本来读取每个操作并按顺序应用它(优点是允许您进行过滤并且速度相当快)
  2. 用于mongodump/mongorestore重播 oplog(见下文)

要以这种方式使用mongodump,您首先必须将其转储为 BSON 格式,以便可以重新存储:

mongodump --dbpath /path/to/folder/with/oplog/files -d local -c oplog.rs -o oplogDump
Run Code Online (Sandbox Code Playgroud)

接下来,将 bson 文件移出文件夹(这基本上是为了方便):

mkdir oplogRestore
mv oplogDump/local/oplog.rs.bson oplogRestore/oplog.bson
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 mongorestore 重播 oplog 并将其应用到给定的运行实例:

mongorestore --host host:port --oplogReplay oplogRestore
Run Code Online (Sandbox Code Playgroud)

如果您只想重播到某个点,您也可以使用 oplogLimit 选项。有关更多信息,请参阅Asya 的出色回答。

请注意,这一切都不会特别快,也不是绝对必要的(如上所述)。