阅读(3988) | 喜爱(1) |
欢迎阅读MongoDB相关文章:
> [MongoDB基础0——MongoDB的安装与可视化管理工具](https://www.onelib.biz/blog/a/58102e920b428a780f76b00f)
> [MongoDB基础1——数据库基本操作](https://www.onelib.biz/blog/a/58103099b1f334780c364081)
> [MongoDB基础2——Mongoose的操作指南](https://www.onelib.biz/blog/a/58103359bdfedb84012c50df)
> [MongoDB基础3——Mongoose的数据交互问题](https://www.onelib.biz/blog/a/581033797d7b481006eec2de)
> [MongoDB基础4——安全与身份认证](https://www.onelib.biz/blog/a/5872e73e51e64c24062f8ef0)
> [MongoDB基础X——踩过的坑以及解决方案(持续更新中)](https://www.onelib.biz/blog/a/58103398147c28ec04867851)
---
# 1.启动MongoDB失败
今天启动MongoDB的时候报如下错误:

这是因为上次关闭MongoDB不当,导致数据文件保持占用。
> 1.先看服务启动没有,如果没有启动服务先启动服务;
> 2.如果服务已经启动了, 那有可能是上次不正常关闭mongo,导致存放数据的文件被占用了,被锁住了。
这种情况只需将\mongodb\data中的mongod.lock文件删掉并重新启动服务即可。
---
# 2.在内容比较小的电脑上部署MongoDB失败
在一台2G内存的老式电脑上部署MongoDB,运行一段时间后,MongoDB自动停止,并报错:
``` console
2016-8-30T00:32:32.914+0800 [conn30751] command tasks.$cmd command: count { count: "taskid", fields: null, query: { md5: "c390a22da3d411675883d6f692f266de" } } planSummary: COLLSCAN keyUpdates:0 numYields:0 locks(micros) r:312476 reslen:48 312ms
2016-8-30T00:32:32.921+0800 [conn30751] VirtualProtect for C:/mongodb/data/db/onelib/tasks.3 chunk 4122 failed with errno:1455 页面文件太小,无法完成操作。 (chunk size is 67108864, address is 4068000000) in mongo::makeChunkWritable, terminating
2016-8-30T00:32:32.922+0800 [conn30751] tasks.taskid Fatal Assertion 16362
```
原因是虚拟内存不够,需要加大虚拟内存才可运行。
1.右键单击“我的电脑”->“属性”->“高级”;
2.在“性能”栏内点“设置”->“高级”;
3.在“虚拟内存”栏内点“更改”,会弹出“虚拟内存”对话框;
4.选“自定义大小”,在“初始大小”里设置为1024,在“最大值”里设置为2048(注意,不能超过4GB,即32位操作系统最大内存寻址范围)。
5.点击“设置”即可生效,如果没有生效,可注销帐户或重启电脑。
---
# 3.MongoDB的安全
## 3.1 悲剧的无密码状态
浏览安全资讯的时候,突然看见一篇关于MongoDB的文章,文章说某一个时间段,有一大部分网站的MongoDB都没有设置密码,任何人都可以直接访问这些网站的数据库,并且有很多是企业级的。
消息真假我不清楚,但真是一语惊醒梦中人,到现在为知,我根本没有考虑过数据库的安全问题,也是到现在才想起来,我根本没有对MongoDB设置过密码,Mongoose也没有输入密码的操作。
惴惴不安地在本地打开一个MongoDB的终端,然后忐忑地输入:
```
mongo www.xxxxx.com:27017
```
然后切换到数据库onelib
```
use onelib
```
然后查看一个数据表:
```
db.users.find()
```
于是,我欢乐地看见了所有用户的明文数据(此处应有哭着笑表情)

如此隐私的数据,就这么被展示出来了,真是无语了。
那么,要怎么做?
---
## 3.2 为你的MongoDB设置密码
首先,在服务器上正常启动MongoDB(即非安全方式):
```
mongod --dbpath ../data/db
```
然后创建一个管理员:
```javascript
db.addUser("<管理员的用户名>", "<管理员的密码>");
// 举个例子
db.addUser("myname", "mypasswd");
```
创建成功后会返回一些提示,然后关闭MongoDB,使用安全的方式再次启动:
```
mongod --auth --dbpath ../data/db
```
此时,如果我们再按照之前的方式来查看users表的数据,则会提示没有登录

这时候,我们需要重新连接:
```
mongo www.xxxxxx.com:27017/admin -u <管理员的用户名> -p
// 按照上面的例子,就应该这样写:
mongo www.xxxxxx.com:27017/admin -u myname -p
```
按回车后,会要求输入密码,此时输入刚刚设置的myname对应的密码mypasswd即可。此后,再去查看users表,则可正常显示了。
---
## 3.3 Mongoose的操作
对于操作本地的MongoDB,由于代码是这样的:
```javascript
mongoose.connect('mongodb://localhost/onelib');
```
由于使用了localhost来连接,并不需要设置密码。如果数据库并非是本地的,我还没有测试,待后续更新(Marked 2016.10.28)。
---
> **原创文章,未经许可,请勿转载**
> 作者:林晓州
> 日期:2016.09.19
> QQ:1139904786
> Blog:http://blog.csdn.net/kkdestiny
linxiaozhou.com