MongoDB数据库的备份,恢复与迁移,回滚

备份与恢复

在创建MongoDB服务的时候,通过--dbpath指定目录就是存放mongdb数据库文件目录,我们可以通过复制这些文件实现数据库的冷备,但是这种方式不太安全。因此在冷备前,要关闭服务器,这个在第一节中介绍过平滑关闭server的命令。


1. >use admin  
2. >db.shutdownServer()


或者可以通过fsync方式使MongoDB将数据写入缓存中,然后再复制备份

1. >use admin  
2. >db.runCommand({"fsync":1,"lock":1})


这个时候我往test.foo 插入了一条数据 f:6 ,在执行db.foo.find()后,并没有查到这条记录,说明记录没有直接写入数据库,而是被缓冲到缓存中了。

备份完后,要解锁(防止这个时候停电或其它原因,导致未缓存中的数据丢失)。

1. >use admin  
2. >db.$cmd.sys.unlock.findOne()  
3. >db.currentOp()    如果currentOp 只返回{"inprog":[]}结果,说明解锁成功。


解锁后,缓存中的数据会写入数据库文件中,我们去查询foo结果。

mogodb备份注意事项_服务器

上面是冷备的方式,我们可以在不停止服务的情况下,使用MongoDB提供的两个工具来实现备份和恢复。这个两个工具在MongoDB的bin目录下可以看到:mongodump/mongorestor

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

mongodump备份命令:


    1. ......bin>./mongodump -d test -o backup            //( backup是备份目录,默认创建到bin目录) 
    2. ./mongodbdump --help 可查看命令的帮助


    mongorestore恢复命令: 

    可以在恢复前往foo表插入一条记录 g:7)


    1. .....bin>./mongorestore -d test --drop backup/test/ 
    2. 提一点的就是 drop选项,这里是说我将test数据恢复之前先删除原有数据库里面的数据


    看一下运行结果:

    mogodb备份注意事项_数据库_02

    以上就是mongodb的备份和恢复过程。当数据库文件出现问题或者损坏时,MongoDB还提供了修复数据文件的命令。

    在启动mongod服务时通过--repair 修复:


    1. ....bin>./mongod --dbpath \usr\mongodb\data\dbs\master"  --repair  
    2. 修复命令必须提供数据路径


    另外我们也可以在mongo shell 中修复正在运行的数据库存


    1. >use test  
    2.  
    3. >db.repairDataBase() 


    接下来我们在来看一下另外二种读扩展式的备份机制。

    Master-Slave

    主从复制模式:即一台主写入服务器,多台从备份服务器。从服务器可以实现备份,和读扩展,分担主服务器读密集时压力,充当查询服务器。但是主服务器故障时,我们只能手动去切换备份服务器接替主服务器工作。这种灵活的方式,使扩展多如备份或查询服务器相对比较容易,当然查询服务器也不是无限扩展的,因为这些从服务器定期在轮询读取主服务器的更新,当从服务器过多时反而会对主服务器造成过载。

    我们以之前创建的端口为27017做为主服务器,再创建个端口为27018从服务器

    重新启动27017为主服务器 --master 主服务器


    1. ....bin>mongod  --dbpath "C:\Program Files\mongodb\data\dbs\master" --master 


    创建27018为从服务器  --slave 从服务器  --source 指定主服务器

    1. ....bin>mongod --port 27018 --dbpath "C:\Program Files\mongodb\data\dbs\slave27018"   --slave --source localhost:27017 


    主服务器可以通过自己local库的slave集合查看从服务器列表

    从服务器可以通过自己local库的source集合查看主服务器信息或维护多个主服务器。 (一个slave服务器可以服务多个master服务器)

    或者我们可以通过http console查看状态


    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    简要说一下MongoDB的备份方式:

    1. mogodump / mongorestore

    这2命令将mongodb的数据dump为BSON格式,需要的时候可以恢复。
    这种方式作为小的数据库还适用。但如果是sharding或者几百G数据以上的话
    就几乎不可用了。因为BSON及其占用空间。

    2. Slave Replication

    这是最适合和可靠的,适合生产环境。MongoDb支持master+多个slave。因此可以很方便的起一个slave来进行备份。
    但是需要注意的是如果数据量很大的话,如果是新建的slave,速度又没有保证的话,一定要调高 oplogSize 的大小,对于一个300G的数据库,
    可以调到60G以上。这样避免同步到中间出现oplogSize不足等异常。

    3. 关于增量热备份

    对于某些热衷单独文件备份的同志,也可以考虑使用“增量热”备份的方式作为最后的屏障。
    做法就是,最开始将某个slave暂时shutdown,然后将数据库文件复制到另一个目录作为增量备份的起点。

    每次备份的时候,在这个目录上起一个slave, 使用–fastsync参数,同步完毕即可tar这个目录就可以了。

    这种方式的一个缺点就是如果备份周期的过长的话,空间浪费会非常大,尤其是频繁删除的情况下,
    目前1.6以前的版本对于删除的空间回收机制有bug。这个问题应该在1.6版本发布时候解决。

    要想回收这些空间需要repairDatabase,速度比较慢,不如直接从头clone一个新的db了。(其实Repair的过程也就是先clone然后copy回来)。

    综上所述, 最靠谱和安全的备份方式就是用mongodb自身的同步复制机制.
    最经典也最小的生产环境是:
    1 master + 2 slaves