• 林晓州 原创 2016/10/26 12:39创建,最后更新于2017/07/11 13:44

    linxiaozhou.com

MongoDB基础X——踩过的坑以及解决方案(持续更新中)

阅读(3988) | 喜爱(1) | 评论(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的时候报如下错误: ![启动mongo失败的报错.png](http://www.onelib.biz\upload\201610261312078775.png) 这是因为上次关闭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() ``` 于是,我欢乐地看见了所有用户的明文数据(此处应有哭着笑表情) ![悲剧的结果](http://www.onelib.biz\upload\201610272359293388.png) 如此隐私的数据,就这么被展示出来了,真是无语了。 那么,要怎么做? --- ## 3.2 为你的MongoDB设置密码 首先,在服务器上正常启动MongoDB(即非安全方式): ``` mongod --dbpath ../data/db ``` 然后创建一个管理员: ```javascript db.addUser("<管理员的用户名>", "<管理员的密码>"); // 举个例子 db.addUser("myname", "mypasswd"); ``` 创建成功后会返回一些提示,然后关闭MongoDB,使用安全的方式再次启动: ``` mongod --auth --dbpath ../data/db ``` 此时,如果我们再按照之前的方式来查看users表的数据,则会提示没有登录 ![提示需要登录](http://www.onelib.biz\upload\201610280006553795.png) 这时候,我们需要重新连接: ``` 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

本页面由 OneLib智库 自动生成于 09:02:26 2025/11/15