本文共 1783 字,大约阅读时间需要 5 分钟。
db每隔一段时间崩溃一次,完全停服的情况下不会崩溃,mongod日志如下
2018-01-16T20:21:43.573+0800 E STORAGE [conn18] no cursor for uri: table:asd()/collection-15-2895040321638166665 2018-01-16T20:21:43.573+0800 I - [conn18] Invariant failure c src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp 1020 2018-01-16T20:21:43.586+0800 I CONTROL [conn18] 0xf840d2 0xf2b679 0xf0e7b9 0xd935cb 0xd936f1 0xd9407c 0xd9439c 0xd8dc3e 0xd0998f 0x906899 0x99cbcc 0x99dafc 0x99e93d 0x9a08b9 0x9a10e5 0x9a3ecc 0x9c6e61 0x9c7e6c 0x9c8b3b 0xba5b9b 0xab2a1a 0x7ea855 0xf3ffa9 0x7fd7b68fd851 0x7fd7b5a9f90d ----- BEGIN BACKTRACE ----- {"backtrace":[{"b":"400000","o":"B840D2","s":"_ZN5mongo15printStackTraceERSo"},{"b":"400000","o":"B2B679","s":"_ZN5mongo10logContextEPKc"},{"b":"400000","o":"B0E7B9","s":"_ZN5mongo15invariantFailedEPKcS1_j"},{"b":"400000","o":"9935CB","s":"_ZN5mongo21WiredTigerRecordStore8Iterator7_locateERKNS_8RecordIdEb"},{"b":"400000","o":"9936F1","s":"_ZN5mongo21WiredTigerRecordStore8IteratorC2ERKS0_PNS_16
初步猜测是某个操作触发了mongo bug,但是线索太少,后来仔细查看mongod日志发现,每次崩溃前日志都会有类似的这行记录
[conn18] no cursor for uri: table:asd()/collection-15-2895040321638166665
看该条日志,大概猜测是库名称叫"asd()"的某个表上写入失败,猜测跟这个叫"asd()"的库有关,登录db发现没有该库;
猜测是这个库名称取值触发了mongodb内部bug,于是测试了一把,果然崩溃
为什么重新登录这个db没有该库,因为只要一写这个库就崩溃,实际上这个库就是空库,show dbs没有显示
翻看了下mongo的官方限制,并没有提到不能使用()等符号,而且如果是限制的符号,那么insert时会给出错误提示,而不是直接崩溃,这个崩溃问题就算比较严重了,以下测试时使用mongo限制的逗号符号做的测试
udb-xlgqgj:PRIMARY> use asd,asd switched to db asd,asd udb-xlgqgj:PRIMARY> db asd,asd udb-xlgqgj:PRIMARY> show tables; udb-xlgqgj:PRIMARY> db.asd.insert({xx:1}) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 2, "errmsg" : "22: Invalid argument" } }) udb-xlgqgj:PRIMARY> db asd,asd
1 业务上最好不要使用特殊符号,哪怕官网没有说不能用,最好还是大小写字母+下划线之类的通用字符,对大家都好
2 升级到mongo 3.2以上,测试了mongo 3.2,没有复现,想必已经修复了