Linux 上 MongoDB 故障排查方法
一 快速定位流程
sudo systemctl status mongod 或 sudo systemctl status mongodbsudo tail -n 50 /var/log/mongodb/mongod.log,必要时实时跟踪:sudo tail -f /var/log/mongodb/mongod.logsudo netstat -tulpen | grep 27017 或 ss -lntp | grep 27017sudo lsof -i :27017/etc/mongod.confls -ld /var/lib/mongodb /var/log/mongodbdf -h;Inode:df -i二 常见症状与处理对照表
| 症状 | 快速检查 | 处理要点 |
|---|---|---|
| 服务启动失败或状态 inactive | systemctl status、日志尾部 |
依据日志报错定位;核对配置路径、权限、端口占用 |
| 启动超时 mongod.service start operation timed out | 日志、端口占用、磁盘空间、权限 | 释放被占用端口或改端口;清理磁盘;修正目录权限;必要时调整 systemd 超时 |
| 端口被占用 Address already in use | lsof -i :27017、netstat -tulpen |
结束占用进程或调整 net.port 后重启 |
| 本地可连,远程被拒绝 | bindIp 配置、云安全组/本机防火墙 |
将 bindIp 设为 0.0.0.0(或指定内网网段);放行 27017/tcp |
| 权限错误 Permission denied | 数据/日志目录属主与权限 | chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb |
| 配置文件错误导致无法启动 | 语法与路径、mongod --config /etc/mongod.conf --fork |
修正 YAML 缩进/路径;用命令行校验配置后再启动 |
| 磁盘空间不足 | df -h |
清理或扩容;WiredTiger 需要额外空间用于检查点与日志 |
| 面板安装后无法启动 | 依赖、配置、权限、端口 | 安装依赖、校对配置路径与属主、释放端口、重启服务 |
三 关键配置与网络检查
net.bindIp: 127.0.0.1net.bindIp: 0.0.0.0(或内网网段如 192.168.1.0/24)net.port: 27017storage.dbPath: /var/lib/mongodbsystemLog.destination: file、systemLog.path: /var/log/mongodb/mongod.log、systemLog.logAppend: trueprocessManagement.fork: true(配合 systemd 使用时通常设为 false)sudo ufw allow 27017/tcpsudo firewall-cmd --add-port=27017/tcp --permanent && sudo firewall-cmd --reloadbindIp 后需重启:sudo systemctl restart mongodmongo --host <服务器IP> --port 27017 或 mongosh <服务器IP>:27017四 日志分析与运维工具
tail -f /var/log/mongodb/mongod.logdb.adminCommand({ getLog: 1 });查看组件:db.getLogComponents()mlogfilter、mplotqueries、mloginfo 进行时间筛选、慢查询统计与图形化jq 对结构化日志做进一步筛选mongod.log,示例配置(/etc/logrotate.d/mongodb):
/var/log/mongodb/mongod.log { daily; rotate 7; compress; missingok; notifempty; sharedscripts; copytruncate; dateext; size 200M; postrotate /bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock) ; endscript }copytruncate 或使用 postrotate 发送信号前,确认 MongoDB 支持该方式,避免日志写入中断五 数据安全与恢复建议
sudo cp /etc/mongod.conf /etc/mongod.conf.bak-$(date +%F)sudo tar czf mongodb-data-$(date +%F).tgz /var/lib/mongodbmongod --repair --dbpath /var/lib/mongodbsudo systemctl restart mongodsystemctl status mongod、tail -n 50 /var/log/mongodb/mongod.log