1. 升级mongodb线上版本到3.2.15,然后启动新的进程,没有问题。
其次,使用以前的数据文件启动另一个进程(指定了新的配置文件,实测mongodb 2.4的配置文件在测试机器上也可以用来启动mongodb),在生产环境的机器上每一次都会报错如下:
Invariant failure cce.get() src/mongo/db/catalog/database.cpp 187
[initandlisten] Got signal: 6 (Aborted)
mongod(_ZN5mongo15invariantFailedEPKcS1_j 0xCB)
2. 尝试了 https://jira.mongodb.org/browse/SERVER-9032 , http://www.cnblogs.com/sailrancho/p/3392181.html
提到的设置locale, 无效!
差点而就打算使用 /usr/bin/mongod -f /etc/mongod.conf --repair . 但是我不放弃,绝对不应轻易采用修复数据库的方式(记得这样是会需要非常多的磁盘空间的)。
逛遍了各大网站,没有看到解决方案!
比如 https://segmentfault.com/q/1010000000602546 , https://jira.mongodb.org/browse/SERVER-14238, https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/mongodb-user/3Ckmgph2Li4/IOznrpCYwAAJ , https://stackoverflow.com/questions/31273977/mongo-db-invariant-failure
3. 于是在测试机器和生产机器上参考官方配置文件,添加如下debug:
systemLog:
destination: file
logAppend: true
verbosity: 5
traceAllExceptions: true
#quiet: true
path: /sda/var/log/mongodb/mongodb300.log
4. 启动服务,获取日志。使用bcompare对比:
测试机器:
0800 D STORAGE [initandlisten] Recovering database: local
2017-07-24T13:34:21.374+0800 D STORAGE [initandlisten] Recovering database: mclog
后面一切正常
生产机器:
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] Recovering database: system
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] mmf open /sda/var/lib/mongodb/system.ns
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] mmf finishOpening 0x7fc51ac90000 /sda/var/lib/mongodb/system.ns len:16777216
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] mmf open /sda/var/lib/mongodb/system.0
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] mmf finishOpening 0x7fc515c90000 /sda/var/lib/mongodb/system.0 len:67108864
2017-07-24T13:25:04.906+0800 D STORAGE [initandlisten] allocating new extent
2017-07-24T13:25:04.925+0800 D STORAGE [initandlisten] MmapV1ExtentManager::allocateExtent desiredSize:4096 fromFreeList: 0 eloc: 0:102000
2017-07-24T13:25:04.925+0800 D STORAGE [initandlisten] 30 writes (1 kB) covered by 30 pre-images (1 kB)
2017-07-24T13:25:04.925+0800 D STORAGE [initandlisten] 0 pre-images coalesced into 6 write intents
2017-07-24T13:25:04.928+0800 I - [initandlisten] Invariant failure cce.get() src/mongo/db/catalog/database.cpp 187
5. 于是非常怀疑生产机器的system命名空间是哪里来的,里面有啥?
进入dbpath,看到system.0,system.ns.
于是在dbpath下创建目录testbak并把上面两个文件mv进去。再次启动,成功了!!
6. 对于老的服务,已经不会在写入新的数据(之前的版本使用的"storageEngine":"mmapv1",所以新版本会延续使用),所以将journal目录重命名,并且设置
storage:
dbPath: /sda/var/lib/mongodb
journal:
enabled: false
再次启动,可以使用。那么可以删除以前的旧数据中的日志了。