MongoDB 的备份与恢复

589 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

MongoDB 虽然提供了非常易用的复制集特性,保证了系统的高可用性,但有些时候,我们依然需要对数据进行备份。除了防止硬件故障引起的数据丢失外,还要防止人为操作带来的数据无删除,因为一旦删除操作进入集群,就会立刻在复制集的各个节点上执行。除此之外,还有一些项目需要满足监管的要求,对数据进行备份。

在 MongoDB 中,一般通过 mongodumpmongorestore 对数据进行备份和恢复,当然也可以用来做数据的迁移。

mongodump 和 mongorestore 的使用

mongodump 并不能在瞬间完成某个时间点的数据备份,因此,从开始备份到完成备份的过程中被修改或写入的数据,并不能被 mongodump 完全备份。

为了解决这个问题,我们需要把备份过程中执行过的操作,也就是 oplog,也记录下来。

所以,大多数情况下,我们需要给 mongodump 指令添加 --oplog 参数。这样,mongodump 备份从开始到结束过程中所有的操作,也会被记录下来。

如下:

mongodump -h 127.0.0.1:27017 --oplog

执行完成后,会得到一个 dump 目录,里面包含备份的数据,以及一个 oplog 的 oplog.json 文件。

恢复数据也很简单:

mongorestore --host 127.0.0.1 --oplogReplay dump

其中的 --oplogReplay 表示在恢复数据后在重放 oplog,默认重放 dump/oplog.bson 中的数据,这个路径也是备份数据的默认存放路径,如果需要指定 oplog.bson 的路径,可以使用 --oplogFile 参数。另外,--oplogLimit 参数可以指定重放 oplog 时的截止时间点。

其它

  • 除了使用 mongodump 和 mongostore,还可以通过备份数据文件来对数据进行备份,但是,这个操作最好在被锁定的从节点上完成,以免影响系统运行。
  • 除了对数据进行全量备份外,还可以通过延迟节点,来实现数据的备份。当出现误操作等意外情况时,延迟节点不会立刻同步主节点的数据,因此可以保留大部分数据。