MongoDB 未启动,因为文件权限问题
Source: Dev.to

原文发布于 Web Warrior Toolbox。
一个 Wired Tiger Turtle 的故事…
在排查项目时,我想在本地运行数据库以便部署热修复。我在电脑上搭建了一个带有有用测试数据的数据库,随后又需要再次使用本地实例进行测试。
我尝试使用常规命令启动 MongoDB:
systemctl start mongod
检查服务状态时发现它并未启动:
systemctl status mongod
状态输出中包含错误,但原因并不明显。查阅了几个聊天机器人的建议后,我意识到答案在日志里。
在 Linux 上,应用日志存放在 /var/log 目录下。MongoDB 对应的日志文件是:
/var/log/mongodb/mongod.log
我查看了日志的最后部分:
sudo tail -n300 /var/log/mongodb/mongod.log
在众多行中,最频繁且最重要的消息是:
[ERROR]: __posix_open_file, 924: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied
错误指向文件 /var/lib/mongodb/WiredTiger.turtle。聊天机器人提示该文件应归 mongodb 用户所有。实际上它归 root 所有,于是我更改了包含目录的所有权:
sudo chown -R mongodb:mongodb /var/lib/mongodb
重新启动服务后,MongoDB 正常启动:
systemctl restart mongod
systemctl status mongod
从这个故事中学到的东西
- 检查日志:日志往往包含你需要的精确错误信息。
- 利用日志向聊天机器人或团队成员提供信息:提供相关日志片段可以更快地解决问题。
- 文件权限很重要:确保 MongoDB 的文件和目录归
mongodb用户所有。
旁白
为什么 WiredTiger.turtle 文件会归 root 所有?第一次热修复是这样运行的:
sudo mongod --config /etc/mongod.conf
直接使用 sudo 启动 mongod 会导致进程以 root 身份创建文件。随后通过 systemctl 启动 MongoDB 时,由于所有权不匹配而失败。将所有权改回 mongodb 后问题得到解决。
让我们继续编码,dev‑san 🤓 加油!