现象

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,没有复现,想必已经修复了

mongo3.0.9库命名的一个S级bug相关推荐

  1. [vue] 从0到1自己构架一个vue项目,说说有哪些步骤、哪些重要插件、目录结构你会怎么组织

    [vue] 从0到1自己构架一个vue项目,说说有哪些步骤.哪些重要插件.目录结构你会怎么组织 1 项目类型 前端的项目目前来看主要分为小程序开发,H5页面开发.PC官网.后台管理系统开发.Nativ ...

  2. 链接详解--共享库命名

    按照共享库的命名惯例,每个共享库有三个文件名:real name,soname和linker name. soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致 ...

  3. 【DG】基于同一个主机建立物理备库和逻辑备库 (四)--添加一个物理dg节点

    [DATAGUARD] 基于同一个主机建立物理备库和逻辑备库 (四)--添加一个物理dg节点 BLOG文档结构图 [DATAGUARD] 基于同一个主机建立物理备库和逻辑备库(一): http://b ...

  4. Boost库命名规则

    由于要跑出代码SfM-Toy-Library https://github.com/royshil/SfM-Toy-Library Prerequisite OpenCV 3.x: http://ww ...

  5. 0基础用android做一个excel表查询器(2):编写程序

    0基础用android做一个Excel表查询器(2):编写程序 编完页面下面就该开始写程序了,首先确定一下思路,很简单,将Excel表写入一个List(或数组)里,然后获取Plain Text中写入的 ...

  6. linux动态库命名规则

    说道"动态库版本兼容",很多人头脑中首先蹦出的就是"Dll Hell".啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了.   在进一步讨论之前来思 ...

  7. axure7.0元件库 安卓_AxureRP 7.0 元件库下载

    分享一些AxureRP 7.0 元件库下载 网上几乎你找不到AxureRP 7.0 元件库的下载地址..大多是失效的!!! 特此ouyaoxiazai发布一个压缩包,包含了一些AxureRP 7.0 ...

  8. python源码编译 带tkinter_python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

  9. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel ...

最新文章

  1. 一维码EAN 8简介及其解码实现(zxing-cpp)
  2. 2019最新进展 | Transformer在深度推荐系统中的应用
  3. java typeof_js中typeof的用法汇总
  4. Android下常见的内存泄露
  5. pop3 postfix 命令_Email基础知识: SMTP/POP3 命令简介
  6. apache2 wordpress目录权限_WSL(ubuntu)的Apache2+CGI(包含CGICC)+SSL的配置
  7. Java Double类compareTo()方法与示例
  8. android开发 视图联动_新版首页技术设计和实现方案(Android)
  9. (转)招行推出的摩羯智能理财,到底是在做什么?
  10. 一句话菜刀 php eval,如何基于菜刀PHP一句话实现单个文件批量上传?
  11. oracle裁员原因_导致Oracle全球性裁员的原因有哪些?
  12. 爱分享 IE地址栏显示空白?360电脑救援巧修复
  13. 《MacTalk 跨越边界》一一1.2 人生如摆摊
  14. [总结]视频质量评价技术零基础学习方法
  15. android 自定义属性
  16. 两国的“微”与“博”——Twitter与新浪微博的功能差异化探究
  17. ajax异步请求刷新
  18. 形式逻辑(普通逻辑)6:复合判断
  19. 养生:拔火罐有什么好处?
  20. thingsboard使用地图和表可视化资产数据~看完还不会 你pan我

热门文章

  1. 腾讯确认封杀“显IP去广告”QQ外挂
  2. MAC系列:蓝牙键盘连接提示:输入magic的pin
  3. KTV项目(歌星点歌)
  4. Vue 实现世界地图展示,根据国家中数量的多少区分(类似世界疫情地图)
  5. Power Pivot - 业务指标的DAX度量值
  6. 音乐在html中连续播放,怎么让PPT中背景音乐在多个页面中连续播放
  7. 【软考-中级 网络工程师】第一章:计算机网络概论(思维导图/知识点)
  8. #python 坐标转换 以CGCS2000转WGS84为例
  9. Charles切环境,使用map Local
  10. 四种简单的图像显著性区域特征提取方法----- AC/HC/LC/FT。