MongoDB_如何找回用户名密码
MongoDB_如何找回用户名密码

MongoDB_如何找回用户名密码

版本:社区版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均没有该用户。