Ubuntu 下 MongoDB 故障排查指南
一 快速定位与通用流程
- 确认服务状态与端口:使用命令查看服务是否运行与端口占用情况,例如:sudo systemctl status mongod;ss -lntp | grep 27017。若服务未运行,优先查看日志定位原因。
- 查看日志:MongoDB 默认日志路径为 /var/log/mongodb/mongod.log。使用 tail -f 实时观察,或按时间/级别过滤,例如:grep -E ‘E|F’ /var/log/mongodb/mongod.log | awk ‘$1 > “2025-11-23T10:00”’; 日志级别含义:F 致命、E 错误、W 警告、I 信息,组件标识如 NETWORK、STORAGE、REPL 可快速定位模块。
- 校验配置与权限:核对 /etc/mongod.conf 中关键项(如 bindIp、port、storage.dbPath、systemLog.path),确保运行用户 mongodb 对相关目录具备读写权限:sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb。
- 资源与系统限制:检查磁盘空间(df -h)、内存、以及文件描述符限制(ulimit -n);必要时提升系统限制并在 /etc/security/limits.conf 为 mongod 设置更高 nofile。
- 变更后重启并复核:sudo systemctl restart mongod;再次确认状态与端口监听,确保变更生效。
二 常见故障场景与处理
| 症状 |
快速检查 |
处理要点 |
| 服务无法启动(Active: failed) |
查看状态和日志首屏报错;核对配置文件语法与路径 |
修正配置后重启;若提示 Unit not found,执行 systemctl daemon-reload 或创建自定义服务单元 |
| 启动报错或反复崩溃,提示锁文件或异常退出 |
检查数据目录是否存在 mongod.lock;查看是否非法关闭 |
删除锁文件并以 repair 方式启动:mongod -f /etc/mongod.conf --repair;再正常启动 |
| 本机 mongo 连接被拒绝(Connection refused) |
systemctl status mongod;ss -lntp |
启动服务;确认 bindIp 包含 127.0.0.1;如远程访问需开放 27017 并调整 bindIp |
| 磁盘空间不足导致启动失败 |
df -h;日志含 “Insufficient free space for journal files” |
清理磁盘;或在配置中启用 smallfiles=true 后启动 |
| 非法关闭后无法启动 |
日志提示锁或 WiredTiger 异常 |
先删除 mongod.lock,再以 --repair 启动以重建一致性 |
| 连接数或文件句柄耗尽 |
日志出现 “Too many open files” |
提升系统 ulimit -n;在 /etc/security/limits.conf 为 mongod 设置更高 nofile |
| 副本集心跳失败 |
查看 REPL 相关日志;检查网络连通 |
测试网络与端口;核查副本集成员状态与 oplog 窗口,必要时重新同步 |
| 查询很慢或 CPU 飙升 |
查看 COMMAND 与执行时间;explain 分析 |
为过滤/排序字段建立复合索引;优化查询与投影,减少 COLLSCAN |
以上场景对应的命令与处理要点可参考下列实践:服务状态与端口检查、日志级别与过滤、配置文件与权限校验、锁文件与 repair 修复、磁盘空间与 smallfiles、连接被拒绝与防火墙/绑定地址、文件句柄限制与副本集异常、慢查询与索引优化。
三 日志分析与性能优化
- 日志分析要点:关注时间戳、级别、组件与上下文。快速过滤过去 1 小时错误:grep -E ‘E|F’ /var/log/mongodb/mongod.log | awk ‘$1 > “2025-11-23T10:00”’;按小时统计错误量:cat mongod.log | grep -oP ‘\d{4}-\d{2}-\d{2}T\d{2}’ | sort | uniq -c;实时跟踪:tail -f /var/log/mongodb/mongod.log。
- 慢查询定位:MongoDB 默认记录超过 100 ms 的查询。可在 shell 中临时提高日志粒度:db.setLogLevel(1);或在配置中调整 slowMS。使用 explain(“executionStats”) 检查是否走索引与扫描量。
- 索引与查询优化:为高频过滤/排序字段建立合适的单字段或复合索引,避免 COLLSCAN;只返回必要字段(投影);分页建议使用 limit/skip 或基于游标的方案;必要时重建碎片化索引(reIndex)。
- 资源与缓存:WiredTiger 缓存建议控制在可用内存的 70%–80%(配置 storage.wiredTiger.engineConfig.cacheSizeGB);优先使用 SSD;结合 mongostat、mongotop 持续观察吞吐、锁、队列与页面错误等指标。
四 安全与维护建议
- 启用认证与最小权限:在 /etc/mongod.conf 中设置 security.authorization: enabled;通过 mongo shell 创建管理员与业务用户并分配最小必要角色;远程访问时谨慎设置 bindIp,仅开放必要来源。
- 备份与恢复:定期使用 mongodump/mongorestore 进行逻辑备份;重要变更前先备份;验证备份可恢复性。
- 变更与升级:变更配置后先小流量验证;保持版本为稳定版,按计划升级并回归关键业务。
- 运行维护:避免 kill -9 强制结束 mongod,优先使用 graceful shutdown;定期巡检日志与监控,建立告警基线。
五 命令速查
- 服务与端口:sudo systemctl status mongod;sudo systemctl restart mongod;ss -lntp | grep 27017
- 日志与过滤:tail -f /var/log/mongodb/mongod.log;grep -E ‘E|F’ /var/log/mongodb/mongod.log | awk ‘$1 > “2025-11-23T10:00”’
- 权限与目录:sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb
- 修复与启动:mongod -f /etc/mongod.conf --repair;mongod -f /etc/mongod.conf
- 连接与防火墙:mongo --host 127.0.0.1 --port 27017;sudo ufw allow 27017
- 性能诊断:db.setLogLevel(1);db.collection.find(…).explain(“executionStats”);mongostat;mongotop