MongoDB NOSQL数据库连载 第11回 MongoDB的备份

 

本文永久链接地址:https://www.askmac.cn/archives/mongodb-backup.html

 

11  MongoDB的备份

在本连载中,至此我们一直注目MongoDB的功能方面的内容,这次开始我们将分几回介绍MongoDB的非功能方面的内容。这次我们将说明非功能特点中不可或缺的备份功能。另外,我们将使用MongoDB的最新版本v2.4。

 

  关于命令标记

$ : 用命令行来实行的命令

> : 用mongo shell执行的命令

MongoDB的备份的概要

 

要对MongoDB进行备份,需要对数据进行备份以及对配置选项进行备份。

 

配置选项用mongod的启动命令或者配置文件来进行指定。无论那种情况,因为只要复制mongod启动shell以及配置文件等文件就可以进行备份了,所以在这次的文章中将省略说明。

 

在数据的备份之中,可以将全备份与部分备份来进行组合使用,但在MongoDB v2.4中没有提供增量备份的功能。因此,这次我们介绍全量备份以及restore的方法。

[参考]

增量备份是为了恢复因为人为错误损害的数据而被实现的功能,其功能目的对应MongoDB的延迟复制功能。关于延迟复制功能,请参考官方网站。

 

 

要用MongoDB进行全量备份时,有以下两种方法。

  1. 复制数据文件的方法
  2. 利用mongodump

复制数据文件的方法

 

复制数据文件的方法,因为没有数据的转换,所以可以高速进行,因为期间会停止数据库,所有需要进行锁定。大部分情况下,对于replica的secondary,用这样的方法取得备份。当然,偶尔会发生oplog溢出,所以要引起注意。变更oplog的尺寸的方法,请参考官方网站。

让我们来试着复制数据文件吧

 

首先,让我们试着用复制数据文件的方法来试着进行全备份以及restore吧。数据目录的路径,默认是/data/db。在配置选项中指定dbpath的情况下,这就是数据目录的路径。这次我们将在数据目录是默认——/data/db的情况下进行。

 

停止mongod,复制每个目录的数据文件。

$ cp -rp /data/db /path/to/backup/mongobackup1-2013-4-24

在此就完成了全备份。可以没有任何问题地重启mongod了。

$ mongod

那么让我们试着在不停止数据库的情况下,使用锁定来进行备份吧。

> use admin

> db.fsyncLock()

在此就将数据库锁定了。接下来,我们将复制目录中的每个数据文件。

$ cp -rp /data/db /path/to/backup/mongobackup2-2013-4-24

最后解除锁定。

> db.fsyncUnlock()

在此就可以在不停止数据库的情况下取得备份。

 

restore

 

 

首先停止mongod并删除旧数据目录。

$ rm -rf /data/db

要进行restore,只要对已经复制了的数据目录进行再配置就行了。

$ cp -rp /path/to/backup/mongobackup1-2013-4-24 /data/db

在此,restore就已经完成了。让我们来启动mongod吧。如下所示,有显示无法启动的情况下,请删除旧的锁定文件。

$ mongodold lock file: /data/db/mongod.lock.

$ rm /data/db/mongod.lock

$ mongod

在此restore就完成了。

 

让我们来试着使用mongodump的方法吧

 

那么接下来,让我们来尝试用mongodump的全备份以及restore吧。

mongodump备份

 

在mongod启动的状态下执行mongodump。

$ mongodump

然后在当前目录中制成dump目录,被保存在每个数据库的转储文件中。

$ ls dump/test/customers.bson   ← collection的所有二进制数据

customers.metadata.json   ← collection的元数据

system.indexes.bson   ←  test数据库的系统index

 

[参考]

 

通过指定out选项,可以变更转储文件的保存地址。

$ mongodump --out /opt/backup/mongodump-2013-4-24

 

 restore

 

使用mongodump进行备份的情况下,使用mongorestore进行restore。但是,mongorestore只能使用数据的insert,需要引起注意。换言之,想将数据完全进行restore的情况时,将mongod停止,删除旧数据目录,必须在启动mongod的情况下删除所有的数据库,再执行mongorestore。

 

 

这次我们将试着将mongod停止,删除旧数据文件后执行mongorestore的方法。先将mongod停止,然后执行以下命令。

$ rm -rf /data/db

作成/data/db目录,启动mongod。

$ mkdir /data/db$ mongod



在启动mongod的状态下,执行mongorestore。在引数中,需要指定转储文件的路径。

$ mongorestore ./dump



在此完成了restore。

 

mongodump的选项

 

在mongodump中有多个的参数,在此,我们介绍一些具有代表性的参数。

 

用collection单位进行的备份
用db选项指定备份对象的数据库,可以在collection选项中,用collection单位减少备份对象。

$ mongodump --db test --collection customers

 

指定查询的结果并导出



在-q选项中,可以用询问来指定满足查询条件的数据才导出。



$ mongodump --db test --collection customers -q "{'rank':'Special member'}"

 

 

远程备份

 

使用mongodump,可以在远程机器上执行mongoDB的备份。在实际应用中,为了避免硬件故障,在别的机器上进行转储数据更好。

 

比如,要取得用host名mongo.example.com的37017port来运行的有认证的mongod的转储文件的话,如下所示。

 

$ mongodump --host mongo.example.com --port 37017 --username user --password pass

 

 

此外的选项中,请参考官方网站的mongodump的页面。mongorestore中也有远程restore以及collection单位的list等很多选项,详细也请参考官方网站的mongorestore的页面。

总结与下次的主题

 

这次我们介绍了MongoDB的备份。是预防系统故障的措施。为了紧急时刻不丢失重要的数据,需要好好设计备份应用。

下次我们将介绍MongoDB的监控,请大家好好期待!

 

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号