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
正文到此结束