前言 MongoDB副本集默认会创建local、admin数据库,local数据库主要存储副本集的元数据,admin数据库则主要存储MongoDB的用户、角色等信息。 Mongodb的gridfs一次插入数据的时候会自动创建几个索引,我们程序里面的账号没有createIndex权限,我需要手动创建一下。结果连接到mongo服务器之后忘记执行use xxxdb来切换数据库了,于是在admin数据库里面创建了一个索引,结果导出一边的程序报出来很多验证问题。 Mongo的admin数据库太脆弱了,只是创建一个索引就挂了。长个教训,以后千万不要手动修改它,更不要用admin保存数据。 反思一下,这次操 MongoDB是一种流行的分布式文档型数据库,它以灵活的数据模型、高性能和高可用性著称。在本文中,我们将深入探讨一起由于在admin数据库中错误操作而导致的问题,以及从中吸取的教训。 MongoDB的副本集在运行时会创建两个内置数据库:local和admin。local数据库用于存储副本集的元数据,如oplog,而admin数据库则用于存储MongoDB的系统用户、角色和其他管理相关的数据。admin数据库具有特殊地位,它的安全性非常重要,因为它是权限验证的核心。 在事故描述中,开发者需要为gridfs(MongoDB的一种文件存储系统)手动创建索引,但账户缺乏必要的createIndex权限。在连接MongoDB服务器时,开发者忘记切换到目标数据库,而是在admin数据库中直接创建了索引。这引发了后续的验证问题,因为admin数据库不应该用于存储应用数据或创建非系统索引。 连接MongoDB时应直接指定目标数据库,而不是先连接到admin数据库再进行切换。这样可以减少忘记切换的几率,确保操作的准确性。正确的命令格式如下: ```bash mongo ourdomain.com/mydb -u tom -p tompass --authenticationDatabase admin ``` 当在admin数据库中执行createIndex操作时,即使返回成功,也需仔细检查是否符合预期。在本例中,开发者忽略了返回信息,未能及时发现错误。 另外,MongoDB的admin数据库内的system.users和system.roles集合用于存储权限信息,并被缓存在内存中以加速鉴权过程。因此,避免在admin数据库中创建自定义数据集合是非常重要的,因为这可能导致性能问题,尤其是写入操作会被提升至全数据库级别的锁,不支持并发写入和读取,这与admin数据库的设计初衷相违背。 从事故中我们可以学到,对于自动化操作,如创建索引,应当有严格的控制和验证机制,以防止意外地影响关键系统。在gridfs中,通常需要为md5和filename字段创建索引,但这应在正确的数据库中进行。 MongoDB的admin数据库是系统管理的核心部分,不应用于存储业务数据。错误地在admin数据库中执行操作可能会导致严重后果,包括性能下降和权限混乱。因此,遵循最佳实践,如正确指定连接数据库、谨慎管理索引创建和避免在admin数据库中保存非系统数据,是避免类似问题的关键。通过这次事故,我们应该加深对数据库管理的理解,提高我们的日常操作规范性,以确保系统的稳定性和安全性。
- 粉丝: 3
- 资源: 996
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于SpringBoot+Vue的校园招聘管理系统(前端代码)
- C++期末大作业-2024-QT仓库商品管理系统,经过老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用
- DH-GSTN5600 剩余电流式电气火灾监控探测器 安装使用说明书
- 天津理工大学信息系统设计实验
- jsp ssm 学校录取查询系统 高校志愿填报录取 项目源码 web java【项目源码+数据库脚本+项目说明+软件工具】毕设
- jsp ssm 网上购物系统 在线购物 在线商城平台 项目源码 web java【项目源码+数据库脚本+项目说明+软件工具】毕设
- 29网课交单平台源码最新修复全开源版本
- jsp ssm 超市网上购物系统 超市管理 超市购物 项目源码 web java【项目源码+数据库脚本+项目说明+软件工具】毕
- 海湾火灾自动报警系统主要设备参数
- C++自制多功能游戏头文件