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这样的非关系型数据库的管理工作。