记一次Mongodb中admin数据库导致的事故

  • A+
所属分类:MongoDB

前言

MongoDB副本集默认会创立local、admin数据库,local数据库主要存储副本集的元数据,admin数据库则主要存储MongoDB的用户、脚色等信息。

Mongodb的gridfs一次插入数据的时刻会主动创立几个索引,我们法式里面的账号没有createIndex权限,我必要手动创立一下。成果衔接到mongo服务器之后忘怀执行use xxxdb来切换数据库了,于是在admin数据库里面创立了一个索引,成果导出一边的法式报出来许多验证问题。

Mongo的admin数据库太懦弱了,只是创立一个索引就挂了。长个教训,以后万万不要手动改动它,更不要用admin保留数据。

反思一下,此次操作失误实在爆出我日常平凡一些欠好的习气。

起首,衔接mongo应该指定目的数据。而我之前都是衔接到admin,然后用use切换到目的数据库。如许不免会忘怀。

$ # 差错使用
$ mongo ourdomain.com/admin -u tom -p tompass
$ # 正确的使用
$ mongo ourdomain.com/mydb -u tom -p tompass --authenticationDatabase admin

第二,差错的在admin数据库执行createIndex,返回的成果明白显示索引创立胜利。

{
  "大众createdCollectionAutomatically"大众 : true,
  "大众numIndexesBefore"大众 : 1,
  "大众numIndexesAfter"大众 : 2,
  "大众ok"大众 : 1,
  ...
}

然则我疏忽了,继续在正确的数据库创立索引。否则可以早一些发现问题。

末了,创立索引应该主动化,好比gridfs这种对md5, filename创立索引的。

慎用admin数据库

当Mongod启用auth选项时,用户必要创立数据库帐号,拜访时依据帐号信息来鉴权,而数据库帐号信息就存储在admin数据库下。

system.version存储authSchema的版本信息
system.users存储了数据库帐号信息
假如用户创立了自界说的脚色,还会有system.roles聚拢

用户可以在admin数据库下树立随意率性聚拢,存储任何数据,但强烈建议不要使用admin数据库存储利用营业数据,最好创立新的数据库。

admin数据库里的system.users、system.roles2个聚拢的数据,MongoDB会cache在内存里,如许不消每次鉴权都从磁盘加载用户脚色信息。今朝cache的维护代码,只有在保证system.users、system.roles的写入都串行化的环境下能力正确事情,详情参考官方issue SERVER-16092

从代码中我们可以看出,MongoDB将将admin数据库上的意向写锁(MODE_IX)直接进级为写锁(MODE_X),也便是说admin数据库的写入操作的锁级别只能到DB级别,不支撑多个collection并发写入,在写入时也不支撑并发读取。假如用户在admin数据库里存储营业数据,则可能遭受机能问题。

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: