可以使用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目录中,数据库名字跟备份时名字相同
Replica Set 节点类型分为三种:
- standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为primary节点;
- passive:存储了完整的数据副本,参与投票,不能成为primary节点;
- arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为primary节点。
本文配置使用2个常规节点和一个arbiter节点,arbiter节点由于不同步数据,所以负载会很小,部署对硬件没有太大的要求。
假设192.168.1.211、192.168.1.212为常规节点,192.168.1.68为arbiter节点。三个节点上的mongodb都是用下面的配置文件,文件存放在/etc/mongodb.cnf:
dbpath = /data/db/
logpath = /data/log/m.log
logappend = true
port = 27017
fork = true
directoryperdb = true
journal = true
replSet = test
rest = true
其中replSet 的 Id 为 test,这个值对应initiate中的”_id”,使用rest参数后可以在web管理界面中显示Replica Set中其他mongodb实例的信息。
使用命令
/usr/local/mongodb/bin/mongod --config /etc/mongodb.cnf
分别启动三个机器上的mongodb实例,使用mongodb客户端登陆两个常规节点中的任何一个,执行如下命令:
rs.initiate(
{"_id" : "test",
"members" : [
{"_id" : 1, "host" : "192.168.1.211"},
{"_id" : 2, "host" : "192.168.1.212"},
{"_id" : 3, "host" : "192.168.1.68", "arbiterOnly" : true}
]
});
或
rs.initiate(
{"_id" : "test",
"members" : [
{"_id" : 1, "host" : "192.168.1.211"},
{"_id" : 2, "host" : "192.168.1.212"}
]
});
rs.addArb('192.168.1.68');
可以使用rs.conf()查看配置情况,rs.status()查看各个节点的状态,经过一小段时间后,他们会选一台作为PRIMARY,其他的常规节点为SECONDARY,同时在js shell中看到提示符从“>”变为对应的 “PRIMARY>” 或 “SECONDARY>” 或 “ARBITER>”。可以在PRIMARY是通过rs.stepDown()来切换PRIMARY,执行此命令后会在剩余的常规节点选一个来充当PRIMARY。
关于初始化中配置members的其他可选参数,可以到官网上查看,地址:http://www.mongodb.org/display/DOCS/Replica+Set+Configuration
Mongodb脚本:把命令行的内容保存到一个文件中,把该文件放在/usr/bin(或任何系统设置的PATH路径中)下,就可以直接用该文件来启动或停止服务了。
本人比较倾向把启动mongodb的参数放在配置文件中,直观且便于管理,例如把参数写入/etc目录下的mongodb.cnf文件中,参数设置如下:
#configuration Options for MongoDB
#
# For More Information, Consider:
# - Configuration Parameters: http://www.mongodb.org/display/DOCS/Command+Line+Parameters
# - File Based Configuration: http://www.mongodb.org/display/DOCS/File+Based+Configuration
dbpath = /data/db/
logpath = /data/log/m.log
logappend = true
#bind_ip = 127.0.0.1
port = 27017
fork = true
#auth = true
noauth = true
directoryperdb = true
journal = true
可以使用命令:
/usr/local/mongodb/bin/mongod --config /etc/mongodb.cnf
来启动mongodb,所以启动脚本就可以这么写
#!/bin/sh
/usr/local/mongodb/bin/mongod --config /etc/mongodb.cnf
假设该文件命名为mongodb-start,存放于/usr/bin下,现在就可以直接用mongodb-start来启动服务了,注意,该文件要有执行的权限。
停止mongodb服务脚步如下:
#!/bin/bash
pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`;
if [ "${pid}" != "" ]; then
kill -2 ${pid};
fi
其实就是通过ps、grep、awk命令找到mongod的进程号,在通过kill来关闭mongod服务,当然查询进程号的命令还有很多,任取一种即可,例如:
ps -C mongod -f | grep mongod |tr -s ' ' | cut -d ' ' -f 2
或
ps aux | grep mongod | grep -v "grep" | awk -F" " '{print $2}'
按照常理,把如下命令
/usr/local/mongodb/bin/mongod --dbpath=/data/db/ --fork --logpath=/data/log/m.log --directoryperdb
放在/etc/rc.local文件中就可以实现开机自启动了,第一次重启机器发现mongodb顺利启动了,再次重启机器后,通过ps没有查看到相应mongod进程,也就是启动失败了。原因是由于重启机器,导致非正常停止mongod服务,mongod.lock中还记录了上次运行的进程号,为了数据的安全需要执行 /usr/local/mongodb/bin/mongod –repair,当然如果直接把mongod.lock文件删除也可以重新启动了,例如:
/usr/local/mongodb/bin/mongod --repair
/usr/local/mongodb/bin/mongod --dbpath=/data/db/ --fork --logpath=/data/log/m.log --directoryperdb
或
rm -rf /data/db/mongod.lock
/usr/local/mongodb/bin/mongod --dbpath=/data/db/ --fork --logpath=/data/log/m.log --directoryperdb
注意上述启动Mongodb都是没有增加journal参数,如果带了此参数就不会那么麻烦了,例如
/usr/local/mongodb/bin/mongod --dbpath=/data/db/ --fork --logpath=/data/log/m.log --directoryperdb --journal
就可以了,就算是非正常重启机器,mongodb也会根据日志去修复数据库的。
另外,如果mongodb的数据目录是通过mount的NFS文件夹,自启动好像有问题的。
在centos下安装了mongodb,使用SecureCRT连接centos后,使用mongo来操作mongodb,在shell使用退格键时出现乱七八糟的字符,造成这个问题原因跟SecureCRT配置有关,修改设置为:选项 –> 会话选项 –> 终端 –> 仿真 –> 终端中选择linux 即可。详细如下图: