MongoDB---管理简析(二)
ip选项,可以指定mongod绑定到的本地ip地址.如:只能从本机应用服务器访问,可以使用
mongod --bindip localhost
默认情况下MongoDB会开启一个简单的http服务器,便于查看运行,锁,复制等方面的信息,要是不想公开这些信息,可以用
--nohttpinterface来关闭管理接口.
可以用--noscripting完全禁止服务端java script执行
9.备份和修复
MongoDB将所有数据都存放在 数据目录 下,默认目录是C:\data\db\.启动MongoDB的时候可以用--dbpath指定数据目录.
不论数据目录在哪里,它都存放着MongoDB的所有数据.要想备份MongoDB,只要简单的复制数据目录中的所有文件即可.
除非服务器做了完整的fsync,还不允许写入,否则在运行MongoDB时创建数据目录的副本并不安全,这样的备份可能已经
破损了,需要修复.
在运行MongoDB时创建数据目录的副本并不安全,所以就得先把服务器关了,再复制数据目录.但是关闭数据库就要停止业务.
10.mongodump和mongorestore
mongodump是一种能在运行时备份的方法.mongodump对运行的MongoDB做查询,然后将所有查到的文档写入磁盘.
因为mongodump是一般的客户端,所以可供运行的MongoDB使用,即便是正在处理其他请求或是执行写入也没有问题.
mongodump使用普通的查询机制,所以产生的备份不一定是服务器数据的实时快照.服务器在备份过程中处理写入时,非常明显. www.2cto.com
mongodump备份时的查询会对其他客户端的性能产生影响.
mongodump --help 获得帮助
mongorestore是从备份中恢复数据的工具.
mongorestore获取mongodump 的输出结果,并将备份的数据插入运行的MongoDB实例中.
如:将数据库test备份到backup目录
mongodump -d test -o backup
使用mongorestore 恢复到testNew 数据库
mongorestore -d testNew --drop backup/test/
-d指定要恢复的数据库.--drop指在恢复前删除集合(若存在),否则数据就会与现有集合数据合并,可能会覆盖一些文档.
可以使用mongorestore --help获得帮助信息
11.fsync和锁
虽然使用mongodump和mongorestore能不停机备份,但是却失去了获取实时数据视图的能力.MongoDB的fsync命令
能在MongoDB运行时复制数据目录还不会损坏数据.
fsync命令会强制服务器将所有缓冲区写入磁盘.还可以选择上锁住址对数据库的进一步写入,知道释放锁为止.写入锁是让
fsync在备份时发挥作用的关键.
在shell中,强制执行fsync并获得写入锁:
db.runCommand({"fsync":1,"lock":1})
这时,数据目录的数据就是一致的,且为数据的实时快照.因为上了锁,可以安全的将数据目录副本作为备份.要是数据库运行在
有快照功能的文件
系统上时,比如LVM,EBS,这个很有用,因为拍个数据库目录的快照很快.
备份好了,解锁:
db.$cmd.sys.unlock.findOne()
db.currentOp()
运行db.currentOp()是为了确保已经解锁了(初次请求解锁会花点时间)
有了fsync命令,就能非常灵活的备份,不用停掉服务器,也不用牺牲备份的实时性能.要付出的代价就是一些写入操作被
暂时阻塞了.唯一不耽误读写还能保证实时快照的备份方式就是通过从服务器备份.
12.从属备份
虽然上面的备份方式很灵活,但都没有从服务器上备份好.当复制的方式运行MongoDB,前面的提到的备份技术就不仅能用在
主服务器上,也可用在从服务器上.从服务器的数据几乎与主服务器同步.因为不太在乎从属服务器的性能或者是能不能读写,
于是就能随意选择上面的3种备份方式:关停,转存或恢复工具或fsync命令.从服务器上备份是MongoDB推荐的备份方式.
www.2cto.com
13.修复
MongoDB的存储方式不能保证磁盘上的数据还能用,因为可能有损毁.MongoDB内置的修复功能会试着恢复损坏的数据文件.
未正常停止MongoDB后应该修复数据库.修复数据库的方式很简单就是 mongod --repair 来启动服务器.
修复数据库的实际过程很简单:将所有的文档导出后马上导入,忽略无效的文档.完成后,会重建索引.数据量大的话,会花很多时间,
因为所有数据都要验证,所有索引都要重建(从MongoDB 1.8 以后版本引入了日志系统,使修复时间打打的缩短).
修复后可能会比修复前少些文档,因为损坏的文档被删除了.
修复数据库还能起到压缩数据的作用.闲置控件(如删除体积较大集合,或删除大量文档后腾出的空间)在修复后会被重新利用.
修复运行中的服务器上的数据库,要在shell用repairDatabases.
use test
db.repairDatabase()
作者 refactor