转载

MongoDB数据文件备份与恢复详解及实验说明

备份与恢复数据对于管理任何数据存储系统来说都是非常重要的。

1、冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy 


MongoDB将所有数据都存储在数据目录下,默认是/data/db/(Windows下是C:/data/db/),启动MongoDB时也可以用--dbpath指定我们自己设置的数据存储目录。 
备份MongoDB数据:只要简单的创建数据存储目录的副本就可以了,直接copy一份。 
恢复MongoDB数据:在MongoDB启动时用--dbpath指定数据存储目录副本位置。 


在服务器运行的情况下直接copy是有风险的,可能copy出来时,数据已经遭到破坏,这种方式下创建数据目录的副本需要在关闭MongoDB服务器的前提下,数据目录中存储的就是关闭那一刻数据的快照,在服务器重新启动之前可以复制目录作为备份。


2、热备份与恢复——MongoDB bin目录下自带的mongodump和mongorestore工具


mongodump是一种能在运行时备份的方法。该命令详细参数如下:
C:/Users/duansf>mongodump --help
Export MongoDB data to BSON files.


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)
  -o [ --out ] arg (=dump)              output directory or "-" for stdout
  -q [ --query ] arg                    json query
  --oplog                               Use oplog for point-in-time
                                        snapshotting
  --repair                              try to recover a crashed database
  --forceTableScan                      force a table scan (do not use
                                        $snapshot)
  --dumpDbUsersAndRoles                 Dump user and role definitions for the
                                        given database






mongorestore获取mongodump的输出结果,并将备份的数据插入到运行的MongoDB实例中实现数据恢复。该命令详细参数如下: 
C:/Users/duansf>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                            validate object before inserting
                                        (default)
  --noobjcheck                          don't validate object before inserting
  --filter arg                          filter to apply before inserting
  --drop                                drop each collection before import
  --oplogReplay                         replay oplog for point-in-time restore
  --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


mongodump(备份)与mongorestore(恢复)示例: 
1、创建mongodb数据库: 
C:/Users/duansf>mongo
MongoDB shell version: 2.6.6
connecting to: test
> use mongodb
switched to db mongodb
> db.mongodb.insert({'name':'duansf','age':'37'})
WriteResult({ "nInserted" : 1 })
> db.mongodb.find()
{ "_id" : ObjectId("56fcf2ee613bba5454cf1d83"), "name" : "duansf", "age" : "37"
}
>
2、mongodump备份mongodb数据库:
C:/Users/duansf>mongodump -d mongodb -o backup  
connected to: 127.0.0.1
2016-03-31T17:51:24.555+0800 DATABASE: mongodb   to     backup/mongodb
2016-03-31T17:51:24.567+0800    mongodb.system.indexes to backup/mongodb/system.indexes.bson
2016-03-31T17:51:24.604+0800             1 documents
2016-03-31T17:51:24.604+0800    mongodb.mongodb to backup/mongodb/mongodb.bson
2016-03-31T17:51:24.782+0800             1 documents
2016-03-31T17:51:24.784+0800    Metadata for mongodb.mongodb to backup/mongodb/mongodb.metadata.json


-d指定需要备份的数据库,-o指定备份位置,上述表示备份mongodb数据库到C:/Users/duansf/backup目录下


3、mongorestore恢复mongodb数据库,并重命名为mongodb2数据库: 
C:/Users/duansf>mongorestore -d mongodb2 --drop backup/mongodb
connected to: 127.0.0.1
2016-03-31T17:56:47.802+0800 backup/mongodb/mongodb.bson
2016-03-31T17:56:47.804+0800    going into namespace [mongodb2.mongodb]
2016-03-31T17:56:47.804+0800     dropping
1 objects found
2016-03-31T17:56:47.808+0800    Creating index: { key: { _id: 1 }, name: "_id_",
 ns: "mongodb2.mongodb" }


-d指定要恢复为的数据库,可以将备份的数据库恢复到与原来不同名的数据库中,这里为mongodb2,--drop表示在恢复前删除集合(若存在)。
否则,数据就会与现有集合数据合并,可能会覆盖一些文档。


此时在MongoDB shell下可以查看到mongodb2数据库,及其中的mongodb集合和数据文档。
C:/Users/duansf>mongo
MongoDB shell version: 2.6.6
connecting to: test
> show dbs
admin      (empty)
chenfeng   0.078GB
dsf        0.078GB
duansf     0.078GB
idex_t     0.078GB
idx_t      0.078GB
local      0.078GB
mongodb    0.078GB
mongodb2   0.078GB  --新创建
test       0.203GB
wangshuai  0.078GB
>


3、fsync和锁方式备份


上面的1,2两点都不能保证备份时获取数据的实时性,因为我们在备份的时候可能还有数据在内存缓冲区中没有写入到磁盘,MongoDB给我们提供了fsync+lock机制就能满足我们的需求。


fsync(注意,只支持1.3+版本):该命令会强制服务器将所有缓冲区中的内容写入磁盘,
                                                  让我们可以实时性获取数据。 
lock(写入锁):通过lock给数据库一个写入锁,阻止对数据库的进一步写入操作,其他实例的写入操作全部被阻
                         塞,直到释放锁为止。写入锁是让fsync在备份时发挥作用的关键。


1、在shell中强制执行fsync并获得lock(写入锁),在备份之前fsync并加锁: 
fsync并加锁: db.runCommand({"fsync":1,"lock":1}),该命令用于admin db。 
> use admin
switched to db admin
> db.runCommand({"fsync":1,"lock":1})
{
        "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
        "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
        "ok" : 1
}
>
该操作强制服务器将所有缓冲区中的内容写入磁盘并对数据库上锁,不允许执行写数据操作,一般在执行数据库备份时有用。
2、db.$cmd.sys.unlock.findOne():释放锁,备份好了就要解锁,该命令用于admin db。 
> db.$cmd.sys.unlock.findOne()
{ "ok" : 1, "info" : "unlock completed" }
>
3、db.currentOp():查看当前锁状态


已经解锁状态: 
> db.currentOp();
{ "inprog" : [ ] }
>
上锁状态: 
> db.currentOp();
{
        "inprog" : [ ],
        "fsyncLock" : true,
        "info" : "use db.fsyncUnlock() to terminate the fsync write/snapshot loc
k"
}
>
其中,fsyncLock为1表示MongoDB的fsync进程(负责将写入改变同步到磁盘)不允许其他进程执行写数据操作


fsync命令能非常灵活的备份,不用停掉服务器,也不用牺牲备份的实时特性。要付出的代价就是一些写入操作被暂时阻塞了。 
唯一不耽误读写还能保证实时快照的备份方式就是通过“从服务器”备份。


4、从属备份


在从服务器上备份是MongoDB推荐的备份方式
</set
</set
正文到此结束
Loading...