>use admin
>db.shutdownServer()
或者可以通过fsync方式使MongoDB将数据写入缓存中,然后再复制备份
>use admin
>db.runCommand({"fsync":1,"lock":1})
这个时候我往test.foo插入了一条数据f:6 ,在执行db.foo.find()后,并没有查到这条记录,说明记录没有直接写入数据库,而是被缓冲到缓存中了。
备份完后,要解锁(防止这个时候停电或其它原因,导致未缓存中的数据丢失)
>use admin
>db.$cmd.sys.unlock.findOne()
>db.currentOp() 如果currentOp 只返回{"inprog":[]}结果,说明解锁成功
解锁后,缓存中的数据会写入数据库文件中,我们去查询foo结果:
Mongodump/ mongorestore
Mongodump备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的,因为在获取快照后,服务器还会有数据写入,为了保证备份的安全,同样我们还是可以利用fsync锁使服务器数据暂时写入缓存中。
Ø 备份命令:
语法:mongodump -h IP -d 数据库-o 文件存在路径
./mongodump -h 192.168.1.36:10000-d testdb –o /Backup/mongodb/
如下所示:
[root@mongo01bin]# ./mongodump -h 192.168.1.36:10000 -d testdb -o /Backup/mongodb/
Ø 出现如下提示说明备份成功:
connectedto: 192.168.1.36:10000
Fri Sep 1416:00:46 DATABASE: testdb to /Backup/mongodb/testdb
Fri Sep 1416:00:46 testdb.blog to/Backup/mongodb/testdb/blog.bson
Fri Sep 1416:00:46 doing snapshot query
Fri Sep 1416:00:46 1 objects
Fri Sep 1416:00:46 Metadata for testdb.blog to/Backup/mongodb/testdb/blog.metadata.json
Ø 数据恢复命令
语法:mongorestore-h 主机-d 目标库-drop --directoryperdb 源文件
【注释】--drop参数,有此参数,则表示,先删除所有的记录,然后恢复。如无此参数,则恢复备份时候的数据,备份之后新增加的数据依然存在;/backup/mongodb则是备份文件存放路径。
如下所示:
[root@mongo01bin]# ./mongorestore --host 192.168.1.36:10000 --db testdb --drop --directoryperdb /Backup/mongodb/testdb/
Ø 出现如下提示说明数据恢复成功
[root@mongo01bin]# ./mongorestore --host 192.168.1.36:10000 --db testdb --drop --directoryperdb /Backup/mongodb/testdb/
connectedto: 192.168.1.36:10000
Fri Sep 1416:17:12 /Backup/mongodb/testdb/blog.bson
Fri Sep 1416:17:12 going into namespace[testdb.blog]
Fri Sep 1416:17:12 dropping
1 objectsfound
Fri Sep 1416:17:12 Creating index: { key: {_id: 1 }, ns: "testdb.blog", name: "_id_" }