一条命令引发的灾难
起初
故事最早发生在2014年6月,那段时间我正在跟随 nswbmw 的博客项目 Nblog 学习 Express 框架。
中间正好用到了 Mongodb 数据库,那也是我初次使用 Mongodb,给我的印象还是很不错的。
当我完成了这个简单博客后,我尝试发了十几条诗词,都是关于唐诗三百首的。
当时对数据库的了解非常有限,也不知道守护进程这些。
直到有一天我重启数据库发现之前的诗词数据都没了。
当时让我觉得非常奇怪,找来公司的技术大牛张春生帮忙,各种修复数据库的方式都试过了,依然没用。
在网上查找 Mongodb 丢失数据的问题,好家伙,不查不知道,一查吓一跳,这么多人都遇到过 Mongodb 丢数据的问题。
在看到很多人遇到和我同样的问题后,我心里告诉我自己,这问题和我没关系,是 Mongodb 本身的缺陷。
发展
故事回到2016年5月5日,当时我正在弄 freecodecamp.cn项目,数据库用的也是 Mongodb。
当时我想给 Mongodb添加安全机制,所以重启了数据库。
结果数据库重启后,安全问题没解决,139个用户数据还都没了,真是赔了夫人又折兵啊。
当时我在微信群和gitter.com/freecodecamp/chinese
上各种道歉,请求大家原谅。
期间程辉给我提供过数据恢复解决方案,都试过,依然没用。
这两次发生在我身上的数据丢失问题让我很长时间都非常郁闷,
对于一个技术人员来说,出现问题,却找不到问题的原因所在,是一件非常让人郁闷的事情。
三年时间、两次灾难,都发生在我身上,这就像一个魔咒,一个永远也解不开的魔咒。
直到今天上午,我来到公司,想从服务器来另开一个 Mongodb 实例来通过 RoboMongo 客户端调试数据,
连接数据库后,发现用户数据和之前的不一样,只有139条。
仔细一看,原来就是之前丢失的用户数据。
再来看我在 Ubuntu 系统新开的 Mongodb 实例的命令:
mongod --dbpath /var/lib/mongodb/ --bind_ip x.x.x.x --port 28027 |
原来我指定的数据目录:/var/lib/mongodb/ 就是我丢失的数据目录。
当你安装 Mongodb 后,通过 service 来启动 mongodb,默认的数据目录就是 /var/lib/mongodb/
。
而后来我通过 mongod 命令的方式来启动 mongodb,默认的数据目录就是 /data/db/
。
回想我当时因为无法通过 service 来启动 mongodb 后,就采用了命令行方式来启动。
却没有注意到数据目录变化的问题。
mongod --logpath /var/log/mongodb.log --bind_ip 127.0.0.1 --fork |
当我明白这两者的区别后,放弃命令行、开始采用配置文件的方式来启动数据库。
mongod -f /etc/mongodb.conf |
所有的数据目录等参数都在配置文件里统一配置,这样就避免了混乱问题。
我本来是要解决数据库调试数据的问题的,无意中解决了之前困扰我许久的那个魔咒。
算是印证了那句老话:「念念不忘,必有回响。」
结局
故事结束了,丢失的数据找回来了,数据库安全问题也解决了。
事情总算有一个圆满的结局,今晚做一个好梦。
写于今晚11点,与大家共享:「所有的问题都有解决方案,只是时间早晚而已」。