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

1. 事件经过

最近公司的一个项目需要部署在Mongodb上,于是我作为负责人在服务器上搭建并配置好了Mongodb环境。但是,事情并没有像我预想的那样顺利。在开发人员测试时发现,他们无法访问Mongodb中的数据。我检查了一下,发现是admin数据库中的用户出了问题。

2. 排查问题

2.1 检查Mongodb日志

我打开了Mongodb的日志文件,发现了一些报错信息:

2021-07-01T20:32:52.334+0800 I ACCESS [conn238] SASL SCRAM-SHA-1 authentication failed for test on admin from client 127.0.0.1:48646 ; UserNotFound: Could not find user "test" for db "admin"

2021-07-01T20:32:54.334+0800 I ACCESS [conn239] SASL SCRAM-SHA-1 authentication failed for test on admin from client 127.0.0.1:51226 ; UserNotFound: Could not find user "test" for db "admin"

2021-07-01T20:32:54.334+0800 I ACCESS [conn240] SASL SCRAM-SHA-1 authentication failed for test on admin from client 127.0.0.1:53240 ; UserNotFound: Could not find user "test" for db "admin"

从日志中可以看出,系统一直在尝试使用test用户进行验证,但是这个用户在admin数据库中并不存在。

2.2 检查用户列表

接下来,我使用Mongodb自带的命令行工具进入admin数据库,尝试查看当前的用列表:

use admin

show users

然后我得到了以下的输出:

[

{

"_id" : "admin.root",

"user" : "root",

"db" : "admin",

"roles" : [

{

"role" : "root",

"db" : "admin"

}

],

"mechanisms" : [

"SCRAM-SHA-1",

"SCRAM-SHA-256"

]

}

]

从输出中可以看出,admin数据库中只有一个用户:root。

3. 解决问题

3.1 重置test用户密码

根据日志信息,我最初的想法是创建一个名为test的用户,但是测试人员告诉我,上线前需要将所有测试数据清空。

所以我使用以下命令重新设置了用户test的密码:

use admin

db.changeUserPassword("test","newpassword")

然后我尝试使用用户名为test,密码为newpassword进行登录,结果仍然是无法访问。

3.2 恢复admin数据库

在这种情况下,我的最后一招是将admin数据库恢复为最初的状态。由于我之前创建了一个备份,所以我尝试使用以下命令将备份数据还原:

mongorestore -h 127.0.0.1 -d admin /data/db/admin-backup

还原过程很快,然而我依然无法使用test用户登录admin数据库。

4. 原因分析

最后,我仔细检查了配置文件,并发现了Mongodb中的一个坑:如果admin数据库丢失,那么所有用户都将无法登录。而我在进行备份数据恢复的过程中,操作失误将admin数据库给删除了,这导致了现在的问题。

5. 解决问题

5.1 重新创建admin数据库

根据这个发现,我决定重新创建一个admin数据库,然后重新创建用户:

use admin

db.createUser(

{

user: "test",

pwd: "newpassword",

roles: [ { role: "root", db: "admin" } ]

}

)

创建成功后,我尝试使用test用户进行登录,果然成功了。

5.2 总结

这次事件教训颇多。首先,配置Mongodb环境时一定要特别小心,任何操作都要确认是正确的再去执行。其次,备份数据的时候要认真检查每个数据文件,确保备份数据的正确性。总之,这次经历让我明白了,只有小心细致才能做好Mongodb这样的非关系型数据库的管理工作。

数据库标签