1. 概述
本手册总结了本次会话中解决的三个主要 MongoDB 故障和配置问题,并提供了详细的操作步骤,以确保 MongoDB 服务的稳定运行和用户认证的正确配置。
2. 问题一:MongoDB 服务启动失败(PID 目录非持久化)
2.1 诊断
错误现象: systemctl status mongod 显示 Active: activating (auto-restart) (Result: exit-code),日志中显示 ERROR: Cannot write pid file to /var/run/mongodb/mongod.pid: No such file or directory。
根本原因: MongoDB 配置文件 /etc/mongodb/mongod.conf 中指定的 PID 目录 /var/run/mongodb 在系统重启或服务停止后被清除(因为 /var/run 是临时文件系统 tmpfs)。
2.2 永久解决方案:使用 systemd tmpfiles.d
为了确保 /var/run/mongodb 目录在每次系统启动时都能被自动创建并设置正确的权限,我们使用 systemd 的 tmpfiles.d 机制。
操作步骤:
-
创建 tmpfiles 配置文件:
创建文件/etc/tmpfiles.d/mongodb.conf并写入以下内容。sudo cat << EOF > /etc/tmpfiles.d/mongodb.conf # Type Path Mode UID GID Age Argument d /var/run/mongodb 0755 mongodb mongodb - EOF-
d:表示创建目录。 -
/var/run/mongodb:要创建的目录路径。 -
0755:目录权限。 -
mongodb mongodb:目录的所有者和所属组(根据mongod.service文件确定)。
-
-
立即应用配置并启动服务:
# 立即应用 tmpfiles 配置,创建 /var/run/mongodb 目录 sudo systemd-tmpfiles --create /etc/tmpfiles.d/mongodb.conf # 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动 MongoDB 服务 sudo systemctl start mongod # 验证服务状态 sudo systemctl status mongod验证结果应显示
Active: active (running)。
3. 问题二:MongoDB 用户创建失败(用户已存在)
3.1 诊断
错误现象: 尝试执行 db.createUser() 时,返回错误 Error: couldn't add user: User "idis_user@admin" already exists。
根本原因: 目标用户 idis_user 已经在认证数据库(admin)中存在。
3.2 解决方案:更新现有用户密码
如果目的是修改用户的密码或角色,应使用 db.updateUser() 命令。本次操作将用户 idis_user 的密码更新为 xxxx。
操作步骤:
-
连接到 MongoDB Shell:
使用具有足够权限的用户(例如root)连接到 MongoDB。mongo --host 127.0.0.1:27017 -u root -p <您的root密码> --authenticationDatabase admin -
切换到认证数据库:
use admin -
更新用户密码:
db.updateUser( "idis_user", { pwd: "xxxx" } )
4. 问题三:客户端认证失败
4.1 诊断
错误现象: 尝试使用 idis_user 连接时,返回 Error: Authentication failed.。
错误命令示例:
mongo --host 192.168.0.2:27017 -u idis_user -p xxxx --authenticationDatabase idis_lhs
根本原因: 用户 idis_user 是在 admin 数据库中创建和定义的,因此它的认证数据库(Authentication Database)必须是 admin,而不是它被授权访问的数据库 idis_lhs。
4.2 解决方案:指定正确的认证数据库
操作步骤:
使用 --authenticationDatabase admin 参数进行连接。
正确连接命令:
mongo --host 192.168.0.2:27017 -u idis_user -p xxxx --authenticationDatabase admin
-
--authenticationDatabase admin:告诉 MongoDB 在admin数据库中查找idis_user的凭证进行认证。
5. 总结
通过以上步骤,我们不仅解决了 MongoDB 服务启动的临时故障,还通过 systemd tmpfiles.d 实现了服务的持久化稳定运行,并修正了用户密码更新和客户端连接认证的配置问题。服务和用户现在均已配置正确并可正常使用。