MongoDB基础3
[liuwei@localhost mongodb]$ ./bin/mongotop --port 27001
[liuwei@localhost mongodb]$ ./bin/mongostat --port 27001
MongoDB默认是没有开启身份验证的。admin和local是两个特殊的数据库,其中的用户可对任何数据库进行操作,相当于超级用户。
# 1、首先切换到admin数据库,添加管理员用户信息 db.addUser("root","cc") # 2、然后切换到要控制的数据库,比如mydb,然后添加用户信息 db.addUser("u1","u1"); # 可读写的 db.addUser("u2","u2",true); # 只读的 # 3、然后重启mongod服务器,加上--auth参数,以启用安全检查 # 4、然后就可以测试了,验证用户使用示例: db.auth("root","cc");
其恢复就是快照的恢复,当然,恢复的时候,确保mongod没有开启
就是把mongod停了,然后拷贝响应的数据文件,最好是把一个数据库相应的数据文件夹完整的拷出,然后恢复的时候完整的拷入。
就是mongod在运行中,可以使用db.fsyncLock(),来锁定数据库,然后进行数据文件的拷贝,拷贝完成后,使用db,fsyncUnLock(),接触锁定。恢复的时候,需要把mongod停了,然后把文件拷入。
这个方式有些缺点,比如速度慢,处理副本集的时候也容易出问题。但对于单独的数据库和集合还是一个好的选择。
如果mongod在运行,只要指定mongod的端口即可:./bin/mongodump --port 20001,会在当前路径下创建dump文件夹,里面存放dump的数据库,真正的数据在.bson文件里。
也可以-h指定主机和端口,-d指定数据库名字,-o指定输出的路径
如果mongod没有运行,使用--dbpath指定数据目录也可以
./bin/mongorestore --port 20001 --drop dump/ # -h 指定主机和端口,-d指定数据库名字, # -directoryperdb指定备份文件所在的位置,也可不写,直接写路径
由于不肯对集群在某一时间点的完整状态备份,因此不太可能对正在运行的分片集群进行“完美的”备份。
因此对于分片集群进行备份恢复,更关注单个分片或者副本集的备份。
./bin/mongoexport --port 27001 -d mydb -c users -o ../databak/mydb.bak # -d:指定要导出的数据库 # -c:指定要导出的集合 # -o:指定输出的数据文件 # 还可以指定导出成csv格式的,比如: ./bin/mongoexport --port 27001 -d mydb -c users -csv -f userId,name -o ../databak/mydb.csv # -csv:指定要导出成csv格式 # -f:指定要导出的列
./bin/mongoimport --port 27001 -d mydb -c users --file ../databak/mydb.bak # --file:用来指定导入的备份文件 # 如果要导入csv格式的话,如下: ./bin/mongoimport -d mydb -c users --type csv --headerline -- file ../databak/mydb.csv
在应用运行时无需调用close,只有当整个应用服务退出关闭时才需调用close。
# 使用连接池时设置连接池参数 MongoClientOptions mcs = MongoClientOptions.builder().connectionsPerHost(6).connectionTimeout(1000).build(); MongoClient mongo = new MongoClient("192.168.1.106:27001", mcs); System.out.println("connectionPerHost==="+mongo.getMongoClientOptions().getConnectionPerHost());
无法使用面向对象的方式去操作对象,只能将对象属性拆分封装成DBObject方式,较为麻烦。在下面一节中MongoDB集成Spring后,我们可以直接使用mongoTemplate增删一个对象,操作方便很多。
尽量在64为机器上使用MongoDB,当然32位机器也能用,但由于MongoDB使用内存映射文件,32位版本只支持2G数据的存储。
MongoDb使用内存映射文件并且每60s向磁盘输出一次通知,这就意味着最大程度上你可能丢失60s加上向影片输出通知这段时间内的所有数据。
为了避免数据丢失,MongoDB从2.0版本起就添加了Journaling(默认情况下开启)。Journaling把时间从60s更改为100ms。如果数据库意外的停机,在启动之前它将会被重启用以确保数据库处于一致状态。当然Journaling会轻微的影响到性能,大约5%。
单机使用MongoDB,应启用日志,就是journal,而多机使用就做副本集
范式化设计通常是通过设计多个集合,然后用字段的值来关联数据的方式;而反范式化设计通常是把相关数据做成内嵌文档,嵌入到文档数据中
通常范式化设计能提高数据的写入速度,而反范式化设计能提高查询速度
在MongoDB中,又把多按照数据量的大小,分成了“多”和“少”,通常少的关系使用内嵌的方式较好,多的关系使用引用的方式较好。
对于多对多的处理,通常还是会引入一个关系集合,从而拆分成两个一对多。
如果文档中有需要不断增长的字段,那么建议把这个字段放在最后。
如果能够预估这个字段最大的长度,还可以采用手动分配的方式,在创建文档的时候就预留足够的空间,从而避免后面移动文档,方式如下:
创建文档的时候,在这个字段后面,任意添加一个字段,比如:needDelete,然后给needDelete字段赋值,值任意,主要是长度要为增长的字段的最大长度
在后面更新文档的时候,就可以使用$unset来移出needDelete字段,如果字段存在就移出,不存在就什么都不做
如果确切的知道存放数据的含义,并要根据含义进行查找,用文档,否则用数组
由于MongoDB左右NOSQL数据库,它有它自身的一些特点,因此并不适合说把所有的数据都用MongoDB来存储。也就是说mysql我们需要,mysql它有它自己的适应场景,但mongodb我们也要,但是只是把一些适合放在mongodb的数据放入其中,大家各有个的优点,各自的适用场景不一样。