ongodb的备份与还原


简要说一下MongoDB的备份方式:
1. mogodump / mongorestore
这两个命令将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

可以使用Mongodb自带的mongodump和mongorestore工具来实现数据库的备份和恢复。其用法比较简单,可以使用如下命令来获取帮助信息:

mongodump --help

mongorestore --help
备份使用命令mongodump,如果执行该命令不带任何参数,会把本机上运行的在默认端口的mongodb中的除local数据库外的所有数据库备份下来,存放在当前执行命令的目录下的dump(如果不存在该目录会自动创建)目录中,并按照数据库的名字存放在不同的不同的目录下,例如有个数据库名为test,那么其备份的文件存放的位置为./dump/test目录下。大部分情况下,我们可能不会这么干,那么可以通过-d来指定需要备份的数据,-o来指定备份存放的位置,同时可以使用-h来指定需要备份的主机地址。例如:

mongodump -h 127.0.0.1:27017 -d atagdata -o /data/dump
或
mongodump -h 127.0.0.1 --port 27017 -d atagdata -o /data/dump
备份本机上的atagdata数据库中的所有collections到/data/dump目录中
每个collections都是以一个文件独立存在,存放路径为/data/dump/atagdata/collections_name.bson

mongodump -h 192.168.1.211 --port 27017 -d atagdata -o /data/dump
备份远程数据库到本地

mongodump -h 127.0.0.1:27017 -d atagdata -c log_01 -o /data/dump
备份atagdata数据库中collections名为log_01的数据
注意:备份不能一次指定多个数据库,也不能一次指定多个collections,也就是说,要么一次备份下来所有数据库,要么一次只备份一个指定的库,同理,在指定了数据库的情况下,要么全部备份该库下的所有collections,要么只备份指定的一个collections,所以要想只备份几个指定的库或collections时,可以多次执行备份命令,修改其数据库名或collections名即可。另外如果数据库需要认证,可以使用-u和-p来指定用户名和密码。



上述用mongodump备份下来的文件,可以通过mongorestore来进行恢复。可以mongodb实例没有启动的情况下执行恢复操作,这个时候必须使用dbpath来指定存放恢复数据的目录,另外可以使用directoryperdb来指定数据库的数据文件是否按文件夹来区分;当然在mongodb已经启动情况下,也是可以执行恢复操作的,这时候dbpath参数不是必须的,如果指定dbpath,那么dbpath不能指定为当前mongodb实例相同的dppath,反之mongorestore会根据当前运行的实例获取dbpath、directoryperdb信息,把备份数据恢复当前的mongodb的dbpath中。例如:

mongorestore /data/dump/
把/data/dump/下所有数据库恢复到当前mongodb中,数据库名字跟备份时名字相同

mongorestore -d test /data/dump/test
恢复test数据库到当前mongodb中test数据库

mongorestore -d new_test /data/dump/test
恢复test数据库到当前mongodb中,并且数据库的名字为new_test

mongorestore -d test --drop /data/dump/test
使用drop参数,在恢复前会删除已有的collections

mongorestore --dbpath /data/db_1 --directoryperdb --drop /data/dump/
把/data/dump/下所有数据库恢复到/data/db_1目录中,数据库名字跟备份时名字相同