您的位置:首页 > 数据库 > Mongodb

MongoDB 备份与还原

2015-03-21 12:04 218 查看
mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport,上一节我们已经介绍过。

mongodump备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的,因为在获取快照后,服务器还会有数据写入,为了保证备份的安全,同样我们还是可以利用fsync锁使服务器数据暂时写入缓存中。

mongodb备份恢复方式有三种,下面分别说到:

1.文件快照方式

2.复制数据文件方式

3.使用mongodump和mongorestore方式
一、文件快照方式

这是最简单的备份方法。但是,需要系统文件支持快照和mongod必须启用journal。如果都符合这两条要求,可以在任何时刻创建快照。

恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。
二、复制数据文件方式

直接拷贝数据目录下的一切文件。但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。

> db.fsyncLock()

上面的命令将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。

然后,拷贝数据文件到备份目录下

# cp -R /data/db/* /backup

文件复制完成后,对数据库进行解锁,允许写操作

> db.fsyncUnlock()

注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。

恢复时,确保mongod没有运行,清空数据目录,将备份的数据拷贝到数据目录下,然后启动mongod

# cp -R /backup/* /data/db/

# mongod -f mongod.conf
三、mongodump和mongorestore

千万不要fsyncLock与mongodump配合使用,如果数据库被锁定了,mongodump将永远挂起。使用mongodump备份比较慢,在备份复制集时还有些问题,后续会说到。但是,用来备份单个数据库、集合、子集合还是比较好的方法。
1.mongodump备份数据库

参数如下:./bin/mongodump -help
Export MongoDB data to BSON files.

Options:
--help                                显示帮助信息
-v [ --verbose ]						打印出更多信息,如时间等等 -vvvvv
--quiet                               忽略非错误信息
--version                             打印版本信息
-h [ --host ] arg                     指定连接的mongodb主机,复制集时设置为<set name>/s1,s2
--port arg                            指定mongodb端口号,也可以这么指定--host hostname:port
--ipv6                                启用支持IPv6 support,默认关闭
-u [ --username ] arg                 用户名
-p [ --password ] arg                 密码
--authenticationDatabase arg          user source (defaults to dbname)
--authenticationMechanism arg (=MONGODB-CR)
authentication mechanism
--gssapiServiceName arg (=mongodb)    Service name to use when authenticating
using GSSAPI/Kerberos
--gssapiHostName arg                  Remote host name to use for purpose of
GSSAPI/Kerberos authentication
--dbpath arg                          直接访问mongod的数据库文件,而不是连接到mongodb服务器。需要锁定数据目录,如果mongod当前在访问相同路径将不能使用。也就是说,mongod运行的情况下不能使用--dbpath,mongod未运行的情况下可以直接指定--dbpath
--directoryperdb                      每个db一个单独的目录,需要指定dbpath
--journal                             启用journaling,需要指定dbpath
-d [ --db ] arg                       指定数据库
-c [ --collection ] arg               指定集合
-o [ --out ] arg (=dump)              指定输出目录,"-"表示标准输出
-q [ --query ] arg                    json查询
--oplog                               使用oplog来生产时间点快照
--repair                              尝试恢复崩溃的数据库
--forceTableScan                      强制表扫描,不使用$snapshot
--dumpDbUsersAndRoles                 备份数据库的用户和角色
常用格式

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径

实例:

备份所有数据库

mongodump -h 127.0.0.1 -o ./data/

备份指定数据库
mongodump -h 127.0.0.1 -d test -o ./data/

2.mongorestore还原数据库

参数如下: ./bin/mongorestore --help

Import BSON files into MongoDB.

usage: mongorestore [options] [directory or filename to restore from]
Options:
--help                                produce help message
-v [ --verbose ]                      be more verbose (include multiple times
for more verbosity e.g. -vvvvv)
--quiet                               silence all non error diagnostic
messages
--version                             print the program's version and exit
-h [ --host ] arg                     mongo host to connect to ( <set
name>/s1,s2 for sets)
--port arg                            server port. Can also use --host
hostname:port
--ipv6                                enable IPv6 support (disabled by
default)
-u [ --username ] arg                 username
-p [ --password ] arg                 password
--authenticationDatabase arg          user source (defaults to dbname)
--authenticationMechanism arg (=MONGODB-CR)
authentication mechanism
--gssapiServiceName arg (=mongodb)    Service name to use when authenticating
using GSSAPI/Kerberos
--gssapiHostName arg                  Remote host name to use for purpose of
GSSAPI/Kerberos authentication
--dbpath arg                          directly access mongod database files
in the given path, instead of
connecting to a mongod  server - needs
to lock the data directory, so cannot
be used if a mongod is currently
accessing the same path
--directoryperdb                      each db is in a separate directory
(relevant only if dbpath specified)
--journal                             enable journaling (relevant only if
dbpath specified)
-d [ --db ] arg                       database to use
-c [ --collection ] arg               collection to use (some commands)
--objcheck                            在插入前验证对象,默认启用
--noobjcheck                          不在插入前验证对象
--filter arg                          插入前过滤
--drop                                在插入前删除所有文档
--oplogReplay                         在恢复时应用oplog
--oplogLimit arg                      include oplog entries before the
provided Timestamp (seconds[:ordinal])
during the oplog replay; the ordinal
value is optional
--keepIndexVersion                    don't upgrade indexes to newest version
--noOptionsRestore                    don't restore collection options
--noIndexRestore                      don't restore indexes
--restoreDbUsersAndRoles              Restore user and role definitions for
the given database
--w arg (=0)                          minimum number of replicas per write
常用格式

mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径

--drop的意思是,先删除所有的记录,然后恢复。

实例:

恢复所有数据库

mongorestore -h 127.0.0.1 ./data/

恢复指定数据库

mongodump -h 127.0.0.1 -d test ./data/

以上可以实现数据库的备份与还原,文件格式是json和bson的,但无法指写到表备份或者还原。mongodump和mongorestore版本最好相匹配。
3.备份复制集

通常情况下,在secondary进行备份,降低primary负载,只在secondary上锁定,以免影响业务(假设没有发送读请求到secondary)。 可以使用上面的任意方式进行备份,不过推荐使用文件快照方式和复制数据文件方式。使用mongodump备份,上面提到了一个问题,那就是在mongodump备份过程中,发生写操作。在复制集架构环境下,要避免这种情况发生,mongodump需要加上–oplog参数,来跟踪备份时服务器上发生的所有操作,获取一个pointin-time快照,否则备份的状态将与集群中其他节点不匹配。在恢复时,还必须创建oplog,并指定–oplogReplay参数来应用这些操作,否则恢复的成员将不知道从何处开始同步,从而在某个时间点上与源服务器保持一致。

在备份复制集时,可以设置mongodump连接"setName/s1,s2,s3″, 它会自动选择一个可用的secondary进行备份。

备份复制集:

# mongodump -h "ttlsa/10.1.1.155,10.1.1.156,10.1.1.157" --oplog -o /backup/mongodbbackup/

恢复复制集步骤:

1)将复制集中要恢复的成员移除集群

2)运行mongorestore –oplogReplay命令

# mongorestore --oplogReplay dump/

3)创建oplog

> use local

> db.createCollection("oplog.rs", {"capped" : true, "size" : 10000000})

4)恢复oplog

# mongorestore -d local -c oplog.rs dump/oplog.bson

注意:oplog.bson不位于dump/local/oplog.rs.bson, oplog.bson记录mongodump过程中发生的操作。

5)将该节点添加到复制集集群中

复制集的相关操作参见 http://www.ttlsa.com/html/1679.html
4.备份分片

在分片集群下,不可能在一个时间点上得到一个完整集群状态的快照。当集群越来越大时,从备份恢复整个架构的几率越来越小的。 因此,对于分片集群的备份,只需独自备份config server和复制集。

在对分片集群进行备份与恢复操作前,要关闭balancer。

对于比较小的分片集群,可以直接从mongos来备份与恢复。

在大多数情况下,我们只需要恢复集群中的某个节点。 如果需要恢复整个集群,那你够倒霉的了,整个集群数据丢失可能性比较小的。备份时,直接连接分片集群的mongod而不是通过mongos。

对于比较小型的分片集群,可以直接通过mongodump连接到mongos进行备份,备份的文件将包含config服务器的元数据信息和实际数据。

对于大型的分片集群,备份步骤如下:

1)关闭balancer。注意:连接到mongos而不是config server实例

> sh.setBalancerState(false) 或

> sh.stopBalancer() 或

> use config

> db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );

2)备份集群元数据。使用mongodump备份任意一台config server。

可以直接连接任意一台的config mongod实例,也可以通过mongos连接。

# mongodump --db config

3)备份shard集群内各个replica set。可并行执行。

4)启用balancer。注意:连接到mongos而不是config server实例。

> sh.setBalancerState(true) 或

> sh.startBalancer() 或

> use config

> db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true );
四、增量备份

1.mongooplog


如果数据量很大的话,备份整个数据库将消耗更多的时间和磁盘空间。这时增量备份将会是个必然的选择,记录前一次的完整备份点,后续的备份只备份从该点发生改变的数据。

这种方法需要一台专门的备份服务器backup_server,当然backup_server需要一个完整的备份,然后通过mongooplog工具来拷贝并应用mongodb_server的oplog日志。

在mongodb_server上执行以下操作:

> op = db.oplog.rs.find().sort({$natural: -1}).limit(1).next();

> start = op['ts']['t']/1000

在backup_server上执行:

# mongooplog --from A --seconds SECOND

SECOND值位于start值与当前时间之间。

mongooplog工具介绍:

mongooplog从远程拉取oplog日志并应用。

./bin/mongooplog --help
Pull and replay a remote MongoDB oplog.

Options:
--help                                显示帮助信息
-v [ --verbose ]                      打印出更多信息,如时间等等 -vvvvv
--quiet                               silence all non error diagnostic
messages
--version                             打印版本信息
-h [ --host ] arg                     指定连接的mongodb主机,复制集时设置为<set name>/s1,s2
--port arg                            指定mongodb端口号,也可以这么指定--host hostname:port
--ipv6                                启用支持IPv6,默认是关闭
-u [ --username ] arg                 用户名
-p [ --password ] arg                 密码
--authenticationDatabase arg          user source (defaults to dbname)
--authenticationMechanism arg (=MONGODB-CR)
authentication mechanism
--gssapiServiceName arg (=mongodb)    Service name to use when authenticating
using GSSAPI/Kerberos
--gssapiHostName arg                  Remote host name to use for purpose of
GSSAPI/Kerberos authentication
--dbpath arg                          直接访问mongod的数据库文件,而不是连接到mongodb服务器。需要锁定数据目录,如果mongod当前在访问相同路径将不能使用。也就是说,mongod运行的情况下不能使用--dbpath,mongod未运行的情况下可以直接指定--dbpath
--directoryperdb                      每个db一个单独的目录,需要指定dbpath
--journal                             启用journaling
-d [ --db ] arg                       指定数据库
-c [ --collection ] arg               指定集合(some commands)
-s [ --seconds ] arg                  seconds to go back default:86400
--from arg                            host to pull from
--oplogns arg (=local.oplog.rs)       ns to pull from
2.10gen发布MongoDB增量备份服务

提供支持按照指定时间点恢复的持续增量备份功能, 不过需要支付的。

提供的特性有:

1)用于数据传输的SSL加密

2)高可用性

3)指定时间点恢复

4)支持分片集群

5)较低的开销

工作原理:

是一个轻量级代理,它从所有正在备份的副本集合中收集oplog,将其压缩并加密,然后通过SSL发送到运行备份服务的数据中心。

此方法的好处有:

1)数据是增量备份的,因此传输的数据相对较小

2)备份服务中的数据与主系统中的数据在时间上非常接近

3)对主系统的影响不会比向副本集合中添加另一个副本大(后者非常缓慢, 可先恢复到最新备份状态,然后在加入集群中同步)

4)oplog支持将副本集合恢复到任意时间点。

有两个备份选项:快照和自定义快照。

备份服务依据一套策略创建和维持备份快照。这些快照中的任何一个都可以用于恢复。同样的,用户也可以指定一个自己希望使用的精确时间点创建一份快照。在这种情况下,将使用该时间点之前最新的快照,并会根据用户指定的时间点应用oplog。

参考文章:
关于MongDB数据迁移方案的研究
mongodb备份与恢复
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb