Debian 上 MongoDB 常见问题与解决方法
一 安装与源配置问题
- 症状:执行 sudo apt install mongodb 提示 E: Unable to locate package mongodb 或 404 Not Found。
- 原因:未添加 MongoDB 官方 APT 源 或版本代号不匹配。
- 解决步骤:
- 安装依赖:sudo apt update && sudo apt install -y apt-transport-https ca-certificates wget
- 导入 GPG 密钥(示例为 6.0,请按所用版本调整):
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
- 添加源(将 bullseye 替换为你的 Debian 代号,如 bookworm):
echo “deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/debian bullseye/mongodb-org/6.0 multiverse” | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
- 更新并安装:sudo apt update && sudo apt install -y mongodb-org
- 启动与验证:sudo systemctl start mongod && sudo systemctl enable mongod;sudo systemctl status mongod;mongo --eval ‘db.runCommand({ connectionStatus: 1 })’
- 若之前误装了系统自带包(如 mongodb/mongodb-org 冲突),建议卸载后仅保留 mongodb-org 官方包再启动。
二 服务无法启动与崩溃排查
- 快速定位:
- 查看服务状态:sudo systemctl status mongod
- 查看日志:tail -f /var/log/mongodb/mongod.log;必要时 grep 关键字(如 “ERROR”, “Fatal”)
- 检查端口监听:ss -ltnp | grep 27017 或 netstat -anp | grep 27017
- 检查数据目录与权限:ls -ld /var/lib/mongodb;确保 mongod 运行用户对 dbPath/logPath 有读写权限
- 常见原因与修复:
- 配置错误(/etc/mongod.conf 路径、端口、网络绑定等):核对配置并修正后重启
- 数据目录不存在或权限不足:mkdir -p /var/lib/mongodb && chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb
- 磁盘空间不足:df -h;清理或扩容后再启动
- 端口被占用:ss -ltnp | grep 27017 找到占用进程并处理,或调整 mongod.conf 的 net.port
- 异常关机导致锁文件残留:确认无 mongod 进程后删除 mongod.lock,再启动(谨慎操作,先备份)
- 升级后配置不兼容:回滚相关参数或参考官方升级指南逐步调整
三 连接与网络访问问题
- 症状:应用或 shell 报 Connection refused、超时或仅本机能连。
- 排查与解决:
- 服务与端口:确认 mongod 已启动并监听 27017(ss/ netstat),如未监听检查日志与配置
- 绑定地址:在 /etc/mongod.conf 设置 net.bindIp(如 127.0.0.1 仅本地;需要远程访问可改为 0.0.0.0 或指定内网 IP,注意安全)
- 防火墙与云安全组:放行 27017/TCP(例如 ufw allow 27017,或云厂商安全组规则)
- 认证与授权:启用认证后,连接需提供用户名/密码或采用合适 authMechanism;副本集需正确配置 replicaSet 与读偏好
- 常见报错:
- “Connection refused”:服务未起/端口不对/被防火墙拦截
- “No Server Chosen by ReadPreference …”:检查 ReadPreference 与副本集成员健康状态、网络连通性
四 性能慢与查询优化
- 监控与定位:
- 实时指标:mongostat(吞吐、延迟、锁等)、mongotop(集合读写耗时)
- 慢查询:开启 Profiling 或设置 slowOpThresholdMs,用 db.getProfilingStatus() 查看级别;分析慢查询日志
- 执行计划:db.collection.find(…).explain(“executionStats”) 检查是否命中索引、扫描方式(COLLSCAN/IXSCAN)
- 优化要点:
- 索引:为高频查询字段建立索引;多条件查询使用复合索引;尽量使用覆盖索引减少回表
- 查询写法:避免全表扫描与无限制返回;使用 limit()/projection 减少数据量;必要时用 hint() 验证索引选择
- 存储引擎缓存:在 /etc/mongod.conf 调整 storage.wiredTiger.engineConfig.cacheSizeGB(依据内存与业务权衡)
- 架构扩展:数据量大或并发高时考虑 副本集/分片 提升吞吐与可用性
五 数据一致性与高可用问题
- 症状:出现 Write concern failed、从节点数据落后或读取旧数据。
- 排查与解决:
- 副本集健康:rs.status() 查看成员 health/optime/lastHeartbeat;确认多数派节点可写、网络时延正常
- 写关注与读偏好:根据业务选择 w: “majority”/wtimeout 与 readPreference(如 primary/secondaryPreferred),避免在不一致窗口读取关键数据
- Oplog 与同步:检查 oplog 大小与同步滞后(rs.printReplicationInfo()),必要时扩容 oplog 或优化节点负载
- 变更流程:变更前备份(mongodump),变更中分阶段执行并观察复制延迟与错误日志