版本:社区版6.0.4
默认情况,在开启认证的情况下,Mongodb允许从本地登陆的客户端创建第一个用户,一旦创建好后后后续所有的操作都需要判断用户的权限。即使不使用任何用户从本地客户端登陆后,客户端也没有任何权限可以操作,所以新集群初始化第一件事就是要创建一个管理员用户。
一、副本集
大致步骤
1. 关闭所有主备实例
kill pidofmongodb
2. 修改主备库配置文件,注释安全相关的配置
#security:
# authorization: enabled
# clusterAuthMode: keyFile
# keyFile: /usr/local/data/mongodb/param/mongodb-keyfile

3. 重新启动所有实例,所有集群需要重新组成一个正常的副本集
/usr/local/data/mongodb/bin/mongod -f /usr/local/data/mongodb/param/mongodb.conf
登录
mongosh mongodb://127.0.0.1:27101/admin

可以发现不需要认证也可以直接登录了, 此时修改密码即可
use admin
show users
## 修改密码
db.changeUserPassword("admin", "admin_pwd1")

最后关闭数据库,参数文件mongodb.conf里面开启认证,取消注释认证相关配置,然后再启动所有实例,集群恢复正常即可。
略。
二、分片集群
重置config数据库密码
因为config集群本质也是一个副本集,所以找回密码方式和副本集找回密码方式一致。
重置shard数据库密码
大致步骤与副本集重置密码一致,唯一的区别是注释配置文件的范围不一样:
一定要把sharding部分内容都注释掉:
#security:
# authorization: enabled
# clusterAuthMode: keyFile
# keyFile: /usr/local/data/mongodb/param/mongodb-keyfile
#sharding:
# clusterRole: shardsvr
类似如下:

否则启动的时候会进程会无法正常fork进程,并且会同时出现好几个mongod进程的现象,同时日志中也会大量报错。

关于分片集群的用户名密码FAQ:
1. 连接mongos的管理员用户保存在哪里?
答案:保存在config集群数据库的admin库下面
2. 连接mongos, 在admin库下面建的用户在哪里?
答案:仍然保存config集群数据库的admin库下面
测试步骤如下

查看config数据库,发现就在此库下面。

继续查看各个shard:
set00没有新建的root用户

set01也没有新建的root用户

3. 在业务库下面建的用户在哪里?
答案:仍然是config数据库,用户信息不存储在shard中
use mydb
db.createUser(
{
user:"mydb",
pwd:"mydb_pwd",
roles:[{role:"readWrite", db:"mydb"}]
}
)

登陆config数据库
发现没有mydb数据库

切到mydb数据库,使用show users命令,发现mydb用户有了。

查看各个shard节点,发现各个shard均没有该用户。