Debian下MongoDB故障排查指南
使用systemctl命令确认MongoDB服务是否正在运行,若未运行则尝试启动并设置开机自启:
sudo systemctl status mongod # 查看服务状态
sudo systemctl start mongod # 启动服务
sudo systemctl enable mongod # 设置开机自启
MongoDB的日志文件默认位于/var/log/mongodb/mongod.log,通过以下命令实时查看最新日志或搜索特定错误关键词(如“error”“failed”):
sudo tail -f /var/log/mongodb/mongod.log # 实时查看最新日志
sudo grep "error" /var/log/mongodb/mongod.log # 搜索错误信息
sudo grep "failed" /var/log/mongodb/mongod.log # 搜索失败信息
MongoDB的主配置文件为/etc/mongod.conf,需重点检查以下关键配置项的语法和值是否符合需求:
storage.dbPath:数据存储目录(如/var/lib/mongodb);systemLog.path:日志文件路径(如/var/log/mongodb/mongod.log);net.port:监听端口(默认27017);net.bindIp:绑定的IP地址(默认127.0.0.1,如需远程访问可改为0.0.0.0)。修改配置文件后,需重启服务使变更生效:
sudo systemctl restart mongod
确保storage.dbPath指定的数据目录存在,且MongoDB进程(属主为mongodb)有读写权限:
sudo mkdir -p /var/lib/mongodb # 创建数据目录(若不存在)
sudo chown -R mongodb:mongodb /var/lib/mongodb # 修改属主为mongodb
sudo chmod -R 755 /var/lib/mongodb # 设置目录权限
netstat或ss命令确认27017端口未被其他进程占用:sudo netstat -tulnp | grep 27017 # 查看端口占用情况
sudo ss -tulnp | grep 27017 # 替代命令(更高效)
若端口被占用,需停止冲突进程或修改MongoDB的net.port配置。ufw防火墙,需允许27017端口通过:sudo ufw allow 27017/tcp # 允许TCP端口27017
sudo ufw reload # 重新加载防火墙规则
mongostat(监控操作频率)和mongotop(监控读写耗时)实时查看数据库性能:mongostat # 监控操作统计
mongotop # 监控读写耗时
explain()方法分析查询性能,找出未使用索引或低效查询:mongo # 进入MongoDB Shell
use your_database # 切换至目标数据库
db.your_collection.find({field: "value"}).explain("executionStats") # 分析查询计划
确保系统有足够的内存、磁盘空间和CPU资源供MongoDB运行:
free -h # 查看内存使用情况
df -h # 查看磁盘空间使用情况
top # 查看CPU使用率
E11000 duplicate key error或lock file exists):删除数据目录下的mongod.lock文件(需确保服务已停止):sudo service mongod stop # 停止服务
sudo rm /var/lib/mongodb/mongod.lock # 删除锁文件(路径以实际为准)
sudo service mongod start # 重新启动服务
rs.status()检查副本集成员状态,确保所有成员正常同步。若使用旧版本MongoDB(如4.x),可能存在已知bug,建议升级到最新稳定版(如6.x),升级前需备份数据并参考官方升级指南。
若以上步骤无法解决问题,可参考MongoDB官方文档的故障排除章节,或在社区论坛(如Stack Overflow、MongoDB Community)搜索类似问题的解决方案。