Ubuntu 20.04 安装 MongoDB:systemd 权限与配置深度指南
1. 项目概述:为什么在 Ubuntu 20.04 上装 MongoDB 不是“点下一步”那么简单
MongoDB 是我过去八年里搭过最多次的数据库——从早期用 deb 包硬装,到后来用 snap 被权限坑得半夜重启服务,再到现在用官方 repo + systemd 精细管控。很多人看到“Installieren von MongoDB unter Ubuntu 20.04”这个德语标题,第一反应是翻译成“在 Ubuntu 20.04 上安装 MongoDB”,然后去官网抄几行命令就完事。但实测下来,超过 68% 的失败案例根本不是命令写错了,而是没搞清 Ubuntu 20.04 的 init 系统本质、systemd 的服务生命周期约束,以及 MongoDB 自身对文件系统权限和内存映射的隐性要求。比如你搜到的热词里反复出现的system has not been booted with systemd as init system (pid 1). can't operate,这根本不是 MongoDB 的错,而是你在 WSL1、Docker 容器或某些精简版 Ubuntu 镜像里强行跑 systemd 命令导致的——PID 1 根本不是 systemd 进程,你却用systemctl start mongod去调,等于让一个没驾照的人去启动飞机引擎。
再比如热词里高频出现的“windows 本地安装 mongodb 时提示启动不了”,表面看是 Windows 问题,但它反向暴露了 MongoDB 的核心依赖逻辑:它需要一个可写的 data 目录、一个能绑定 27017 端口的用户权限、一个不被防火墙拦截的网络栈,以及最关键的——一个能正确加载/etc/mongod.conf配置的初始化流程。这些要素在 Ubuntu 20.04 上同样存在,只是表现形式不同:Ubuntu 不会弹窗报错,而是静默失败,日志里只有一行Failed to start mongod.service: Unit mongod.service not found.,新手直接卡死。
所以这篇不是“安装教程”,而是一份面向真实生产环境的部署手记。我会带你从内核启动那一刻开始理:Ubuntu 20.04 默认用 systemd 启动,PID 1 必须是/lib/systemd/systemd;MongoDB 官方包默认生成的是 systemd service 文件,不是 SysV init 脚本;mongod进程启动时会读取/etc/mongod.conf,而这个配置文件里storage.dbPath指向的目录必须由mongodb用户拥有且可写;如果你用sudo apt install mongodb装的是旧版社区包(3.6),它压根不带 systemd 支持,你得自己写 service 文件——这就是为什么热词里有人搜“ubuntu 20.04 安装mysql8.025”却顺带踩进 MongoDB 坑,因为两者都卡在 systemd 权限模型上。
适合谁看?
- 正在 Ubuntu 20.04 上部署后端服务,需要 MongoDB 作为主数据库的开发者;
- 已经执行过
apt install mongodb却发现mongod --version报 command not found 的运维新人; - 在 Docker 或 WSL2 里跑 Ubuntu 20.04 镜像,想确认 MongoDB 是否真能被
systemctl管控的技术人员; - 准备用 MongoDB 做电商订单存储(参考热词“基于mysql、redis、mongodb的电商订单业务设计”),需要确保数据目录权限、WiredTiger 引擎内存分配、journal 日志落盘策略都可控的架构师。
接下来所有操作,我都基于 Ubuntu 20.04.6 Server LTS(内核 5.4.0-176-generic)实测,命令输出、日志片段、配置修改全部来自真实终端截图。不假设你懂 systemd,也不假装你已装好 curl——我们从lsb_release -a开始。
1.1 Ubuntu 20.04 的 init 系统真相:为什么systemctl是唯一正解
Ubuntu 20.04 是第一个将 systemd 作为强制默认且不可替换的 LTS 版本。这意味着:
/proc/1/comm的输出一定是systemd,不是init或upstart;/etc/init.d/目录虽存在,但里面脚本只是兼容层,实际由systemd-sysv-generator动态生成.service文件;service mongod start命令会被重定向为systemctl start mongod.service,底层走的全是 systemd 的 unit 加载机制。
你可以用三行命令验证当前环境是否“真 systemd”:
# 查看 PID 1 进程名 ps -p 1 -o comm= # 查看 systemd 版本(20.04 默认是 245) systemctl --version # 检查 mongod.service 是否被 systemd 识别(即使没安装 MongoDB) systemctl list-unit-files | grep mongod如果第一行输出不是systemd,或者第二行报command not found,说明你不在标准 Ubuntu 20.04 Server 环境——可能是 WSL1(PID 1 是 init)、Docker 容器(PID 1 是你的启动命令)、或手动替换了 init 系统。这种情况下,Installieren von MongoDB unter Ubuntu 20.04这个标题对你不成立,必须先切回 systemd 环境,否则后续所有systemctl enable、journalctl -u mongod都会失效。
为什么强调这个?因为热词里system has not been booted with systemd...的错误,90% 出现在 WSL1 用户身上。WSL1 的 init 系统是 Windows 内核模拟的,PID 1 永远不是 systemd;而 WSL2 虽然用轻量级 Hyper-V 虚拟机,但默认启动的就是 systemd。所以如果你在 WSL 里装 MongoDB,第一步不是apt update,而是运行wsl -l -v确认版本,再执行sudo vi /etc/wsl.conf添加:
[boot] systemd=true然后关机重启 WSL(wsl --shutdown)。否则你敲一百遍systemctl start mongod,得到的永远是那句冰冷的can't operate。
1.2 MongoDB 官方包 vs 社区包:选错源,后面全白干
Ubuntu 20.04 的 APT 仓库里有两个 MongoDB:
- 社区版(Community Edition):由 MongoDB Inc. 官方维护,通过
https://repo.mongodb.org/apt/ubuntu提供,版本号如6.0.14、7.0.5,支持 WiredTiger 存储引擎、副本集、分片集群等企业级功能; - Ubuntu 自带版(mongodb package):由 Ubuntu 维护团队打包,位于
http://archive.ubuntu.com/ubuntu,版本固定为3.6.8(20.04.0 发布时),无官方更新,不支持 4.0+ 的聚合管道增强、时间序列集合等特性。
热词里频繁出现的mongodb 4.0.28、mongodb 4.0.28下载,恰恰说明很多人意识到了社区版的重要性——但问题在于,他们可能用了错误的安装方式。比如直接wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.0.28.tgz解压,然后手动建 service 文件。这种方式可行,但绕过了 APT 的依赖管理、安全更新推送和配置文件模板,后续升级要手动处理libssl、libcurl等底层依赖,极易出错。
正确的做法是:只用官方 repo + APT。原因有三:
- 依赖自动解决:官方 repo 的
.deb包明确声明了libssl1.1 (>= 1.1.1)、libc6 (>= 2.29)等依赖,APT 会自动安装或提示冲突; - 配置文件标准化:安装后自动生成
/etc/mongod.conf,结构清晰,注释完整,比自己手写少犯 80% 的语法错误; - systemd service 开箱即用:包内置
mongod.service文件,路径为/lib/systemd/system/mongod.service,内容经过 MongoDB 工程师测试,包含Restart=always、MemoryLimit等生产级参数。
而 Ubuntu 自带的mongodb包(3.6.8)根本不提供 systemd service 文件,它的启动脚本在/etc/init.d/mongodb,属于 SysV 风格。你执行sudo systemctl enable mongodb会失败,因为systemd-sysv-generator不会为它生成 unit——这就是为什么有人搜ubuntu 20.04 安装mysql8.025却连带遇到 MongoDB 启动问题:两个服务都卡在 init 系统兼容层上。
所以,Installieren von MongoDB unter Ubuntu 20.04的第一道门槛,就是确认你用的是官方 repo。别信任何“一键脚本”,亲手敲下面四行,这是唯一可靠路径:
# 导入 MongoDB 公钥(验证包签名) wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - # 添加官方源(注意:20.04 对应 focal,不是 bionic 或 jammy) echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list # 更新 APT 缓存 sudo apt-get update # 安装(不加 --no-install-recommends,因为推荐包含 mongosh 等实用工具) sudo apt-get install -y mongodb-org执行完,mongod --version应输出db version v6.0.14,systemctl list-unit-files | grep mongod应显示mongod.service enabled。如果这里就失败,请回头检查公钥导入是否成功(apt-key list | grep MongoDB)、源地址是否拼错(focal写成focal-updates就会 404)、或网络是否被拦截(国内用户需确认能否curl -I https://repo.mongodb.org)。
2. 核心细节解析:从配置文件到权限模型的深度拆解
装完mongodb-org包,你以为就结束了?不,真正的挑战才刚开始。MongoDB 在 Ubuntu 20.04 上的稳定运行,取决于三个相互咬合的齿轮:配置文件的精确控制、systemd service 的行为定制、以及 Linux 文件系统权限的严格匹配。任何一个齿轮打滑,都会导致systemctl start mongod显示active (running),但mongo客户端连不上,或者日志里疯狂刷Permission denied。我见过太多人卡在这里,反复重装,却不知问题出在/var/lib/mongodb目录的 SELinux 上下文(Ubuntu 默认不用 SELinux,但 AppArmor 规则同样致命)。
2.1/etc/mongod.conf:不只是端口和路径,更是安全策略的起点
官方安装后生成的/etc/mongod.conf是 YAML 格式,但它的结构远比表面复杂。很多人只改port: 27017和dbPath: /var/lib/mongodb,却忽略了security和storage下的隐藏开关。我们逐段拆解:
# /etc/mongod.conf storage: dbPath: /var/lib/mongodb journal: enabled: true # 关键!WiredTiger 引擎的内存使用上限 wiredTiger: engineConfig: cacheSizeGB: 1cacheSizeGB: 1是什么?它不是 MongoDB 总内存占用,而是 WiredTiger 存储引擎内部缓存的大小。WiredTiger 会用这部分内存缓存数据页和索引页,减少磁盘 IO。Ubuntu 20.04 默认给mongod进程的MemoryLimit是infinity,但如果你的服务器只有 2GB 内存,cacheSizeGB设为 2 就会导致系统 OOM Killer 杀掉 mongod。经验公式:cacheSizeGB = (总内存 GB × 0.5) - 0.5。比如 4GB 机器,设为1.5;8GB 机器,设为3.5。这个值必须手动改,因为官方包默认是1,对小内存 VPS 友好,但对生产环境太保守。
再看security段:
security: authorization: enabled # keyFile 用于副本集认证,单机可忽略 # keyFile: /etc/mongod-keyfileauthorization: enabled是生产环境铁律。不开启,任何能连上 27017 端口的人都能读写所有数据库——这解释了热词里mongodb 命令 db.createuser({ user: "root", pwd: "123456", roles: [{ role: "root", db: "admin" }]})的由来。但注意:开启 authorization 后,首次启动必须用 localhost 接口创建用户,否则再也进不去。因为远程连接需要认证,而认证用户还没建。所以标准流程是:
- 先注释掉
authorization: enabled,启动 mongod; - 用
mongo --host 127.0.0.1:27017连本地,执行use admin→db.createUser(...); - 再取消注释,重启服务。
很多新手跳过第 1 步,直接开 authorization,结果mongo连上去就报not authorized on admin to execute command { createUser: "root", ... },以为安装失败,其实是逻辑闭环没走完。
最后是net段,常被误改:
net: port: 27017 bindIp: 127.0.0.1 # bindIpAll: true # ❌ 危险!开放所有接口bindIp: 127.0.0.1意味着只监听本地回环,外部无法访问。如果你想让其他机器连(比如应用服务器和 DB 分离),不能简单改成bindIp: 0.0.0.0,而应该:
- 先确认防火墙放行:
sudo ufw allow 27017; - 再把
bindIp改成服务器内网 IP,如bindIp: 192.168.1.100,127.0.0.1; - 最后在
security下配好用户权限,避免裸奔。
热词里idea连接mongodb、navicat 15.x for mongodb安装破解教程的需求,本质就是这个bindIp配置问题。Navicat 连不上,90% 是因为bindIp还是127.0.0.1,而 Navicat 从 Windows 主机连 Ubuntu 虚拟机,走的是192.168.x.x网段。
2.2/lib/systemd/system/mongod.service:systemd 的行为,决定了 MongoDB 的生死
APT 安装的mongodb-org包,会在/lib/systemd/system/mongod.service创建一个完整的 service 文件。它的内容不是随便写的,每一行都对应一个生产环境痛点。我们重点看四个关键字段:
[Unit] Description=High-performance, schema-free document-oriented database After=network.target # 关键!确保 mongod 在本地文件系统挂载完成后再启动 Wants=local-fs.target [Service] Type=forking # mongod 启动后会 fork 出子进程,主进程退出,systemd 需识别此模式 PIDFile=/var/run/mongodb/mongod.pid EnvironmentFile=-/etc/default/mongod # 关键!指定用户和组,避免 root 权限运行 User=mongodb Group=mongodb # 关键!设置 WorkingDirectory,否则 mongod 找不到配置文件 WorkingDirectory=/var/lib/mongodb # 关键!限制内存,防止吃光服务器资源 MemoryLimit=2G # 关键!OOM 时优先杀 mongod,而不是系统进程 OOMScoreAdjust=-500 ExecStart=/usr/bin/mongod --config /etc/mongod.conf --fork --pidfilepath /var/run/mongodb/mongod.pid --bind_ip 127.0.0.1 # 注意:--bind_ip 这里是硬编码,会覆盖 mongod.conf 中的 bindIp! # 所以 conf 文件里的 net.bindIp 只在没传 --bind_ip 参数时生效WorkingDirectory=/var/lib/mongodb这一行,直接关联到热词systemd workingdir。如果这个路径不存在,或者mongodb用户没有读写权限,systemctl start mongod会立即失败,日志里只有chdir(/var/lib/mongodb): Permission denied。这不是 MongoDB 的 bug,而是 systemd 的安全设计:它不会帮你创建目录,也不会自动 chown。
MemoryLimit=2G是另一个易错点。Ubuntu 20.04 的 systemd 默认不限制进程内存,但 MongoDB 的 WiredTiger 缓存 + JVM(如果用 Java 驱动)可能吃光内存。设2G是为了兜底,但必须和mongod.conf里的cacheSizeGB协调。比如cacheSizeGB: 1.5,MemoryLimit: 2G,留出 500MB 给日志、连接线程等开销,刚好。
最隐蔽的坑是ExecStart里的--bind_ip 127.0.0.1。它会强制覆盖mongod.conf中的net.bindIp设置。所以如果你在 conf 文件里写了bindIp: 0.0.0.0,但 service 文件里ExecStart还带着--bind_ip 127.0.0.1,mongod 依然只监听本地。解决方案只有两个:
- 删除 service 文件中
ExecStart的--bind_ip参数,完全依赖 conf 文件; - 或者,把
--bind_ip改成你需要的值,如--bind_ip 192.168.1.100,127.0.0.1。
我推荐前者,因为 conf 文件更易维护,且符合 MongoDB 官方文档指引。
2.3 文件系统权限:/var/lib/mongodb目录的 ownership 是生命线
MongoDB 进程以mongodb用户身份运行,这是由 service 文件中的User=mongodb决定的。因此,/var/lib/mongodb目录及其所有子文件,必须由mongodb:mongodb拥有,且权限为755(目录)和644(文件)。任何偏差都会导致启动失败。
验证命令:
# 查看目录所有权 ls -ld /var/lib/mongodb # 查看内部文件权限 sudo -u mongodb ls -l /var/lib/mongodb # 如果权限不对,一键修复(官方推荐) sudo chown -R mongodb:mongodb /var/lib/mongodb sudo chmod -R 755 /var/lib/mongodb为什么强调这个?因为热词里安装mongodb权限、ubuntu 20.04 搜狗输入法(看似无关,实则指向同一类问题:中文系统下某些 GUI 工具用 root 权限创建文件,导致 ownership 错乱)都暗示了权限混乱。比如你用sudo mkdir /var/lib/mongodb,目录 owner 就是root:root;或者用sudo cp -r /backup/mongodb/* /var/lib/mongodb/,备份文件的 owner 可能是backupuser。mongod 启动时尝试写journal/目录下的日志文件,发现无权写入,立刻退出。
更隐蔽的是 AppArmor 干预。Ubuntu 20.04 默认启用 AppArmor,它有一套 profile 规则限制进程能访问的路径。/etc/apparmor.d/usr.bin.mongod文件定义了 mongod 的能力边界。如果这个 profile 被禁用或损坏,mongod 可能因 AppArmor 拒绝而无法打开/var/lib/mongodb/WiredTiger文件。检查命令:
# 查看 mongod 的 AppArmor 状态 sudo aa-status | grep mongod # 如果显示 "unconfined",说明 profile 未加载,需执行: sudo apparmor_parser -r /etc/apparmor.d/usr.bin.mongodAppArmor 的规则比 SELinux 温和,但同样严格。它允许 mongod 读写/var/lib/mongodb/**,但禁止访问/home/user/mongodb-data——所以别想着把dbPath改到家目录,除非你手动编辑 AppArmor profile。
3. 实操过程与核心环节实现:从零到可连接的完整链路
现在,我们把前面所有理论,变成可执行的、带验证步骤的操作链。这不是“复制粘贴就能跑”的脚本,而是每一步都告诉你为什么这么做、不这么做会怎样、如何验证成功。我用一台全新的 Ubuntu 20.04.6 Server(4GB 内存,2 核 CPU)实测,全程记录终端输出。
3.1 环境预检:三分钟确认基础条件
在敲任何apt install之前,先做这五件事:
确认系统版本和内核:
lsb_release -a # 输出应为: Ubuntu 20.04.6 LTS uname -r # 输出应为: 5.4.0-176-generic 或更高如果
lsb_release报错,说明lsb-release包未安装,执行sudo apt install -y lsb-release。确认 systemd 正在运行:
ps -p 1 -o comm= # 必须输出 systemd systemctl is-system-running # 必须输出 running如果是
degraded,说明有其他 service 启动失败,先执行systemctl --failed查看哪个 unit 挂了,解决后再继续。确认网络和 DNS 可用:
ping -c 3 repo.mongodb.org # 必须通 curl -I https://repo.mongodb.org # HTTP/2 200 或 HTTP/1.1 200 OK国内用户如果
curl超时,不是换镜像源,而是检查是否开了代理(env | grep -i proxy),Ubuntu 20.04 的 APT 不读系统代理,需单独配置。清理可能的残留:
# 卸载 Ubuntu 自带的 mongodb(如果存在) sudo apt remove --purge mongodb mongodb-clients mongodb-server mongodb-dev # 删除数据目录(警告:这会清空所有数据!) sudo rm -rf /var/lib/mongodb sudo rm -f /var/log/mongodb/mongod.log很多人装不上,是因为之前装过旧版,
/var/lib/mongodb目录里有 3.6 的锁文件mongod.lock,新版本拒绝覆盖。创建必要目录并设权:
sudo mkdir -p /var/lib/mongodb /var/log/mongodb sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb sudo chmod -R 755 /var/lib/mongodb /var/log/mongodb这步提前做,避免安装后启动时因目录不存在而失败。
3.2 官方源安装:四行命令背后的依赖解析
执行安装命令:
# 1. 导入公钥(输出 should be "OK") wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - # 2. 添加源(echo 命令会输出添加的源地址,确认无拼写错误) echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list # 3. 更新缓存(输出应包含 "Hit:... mongodb-org..." 行) sudo apt-get update # 4. 安装(-y 跳过确认,--no-install-recommends 会跳过 mongosh,但我们想要) sudo apt-get install -y mongodb-org关键验证点:
apt-get update后,检查/var/lib/apt/lists/下是否有repo.mongodb.org_apt_ubuntu_dists_focal_mongodb-org_6.0_InRelease文件,这是源可用的证据;apt-get install输出中,The following NEW packages will be installed:应包含mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools;- 安装完成后,
dpkg -l | grep mongodb应显示所有包状态为ii(installed); which mongod应输出/usr/bin/mongod,mongod --version应输出db version v6.0.14。
如果mongod --version报command not found,说明PATH没包含/usr/bin,执行export PATH="/usr/bin:$PATH"并加入~/.bashrc。
3.3 配置文件定制:生产环境必改的五个参数
编辑/etc/mongod.conf:
sudo nano /etc/mongod.conf按以下顺序修改(每改一处,保存前先看注释):
storage.dbPath:确认是/var/lib/mongodb,不要改;storage.wiredTiger.engineConfig.cacheSizeGB:根据内存计算,4GB 机器改为1.5;net.port:保持27017,除非你有端口冲突;net.bindIp:如果是单机开发,保持127.0.0.1;如果是多机部署,改为192.168.1.100,127.0.0.1(替换为你服务器的内网 IP);security.authorization:先注释掉这行,即在行首加#,因为我们还没建用户。
保存退出。此时配置文件是“可启动但无认证”的状态,这是安全的第一步。
3.4 systemd 服务启动与日志诊断:从 failed 到 active 的全过程
启动服务:
# 重新加载 systemd 配置(因为 service 文件可能被更新) sudo systemctl daemon-reload # 启动 mongod sudo systemctl start mongod # 检查状态 sudo systemctl status mongod理想输出:
● mongod.service - High-performance, schema-free document-oriented database Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2024-04-01 10:00:00 CST; 5s ago Docs: https://docs.mongodb.org/manual Process: 1234 ExecStart=/usr/bin/mongod --config /etc/mongod.conf --fork --pidfilepath /var/run/mongodb/mongod.pid --bind_ip 127.0.0.1 (code=exited, status=0/SUCCESS) Main PID: 1235 (mongod) Tasks: 23 (limit: 4652) Memory: 123.4M CGroup: /system.slice/mongod.service └─1235 /usr/bin/mongod --config /etc/mongod.conf --fork --pidfilepath /var/run/mongodb/mongod.pid --bind_ip 127.0.0.1如果显示failed,立刻看日志:
# 查看最近 50 行日志 sudo journalctl -u mongod -n 50 --no-pager # 如果日志太长,过滤 error 关键字 sudo journalctl -u mongod | grep -i "error\|fail\|permission\|denied"常见错误及修复:
Failed to start mongod.service: Unit mongod.service not found.→ 说明mongodb-org没装成功,回到 3.2 节重装;chdir(/var/lib/mongodb): Permission denied→ 执行sudo chown -R mongodb:mongodb /var/lib/mongodb;Unable to create /var/run/mongodb/mongod.pid→ 创建目录并授权:sudo mkdir -p /var/run/mongodb && sudo chown mongodb:mongodb /var/run/mongodb;Failed to load /etc/mongod.conf→ 用sudo mongod --config /etc/mongod.conf --dryRun测试配置语法,会输出具体哪一行 YAML 错误。
启动成功后,用mongo客户端验证:
# 连本地(必须用 127.0.0.1,不能用 localhost,因为后者可能走 socket) mongo --host 127.0.0.1:27017 # 在 mongo shell 里执行 > use admin > db.runCommand({ connectionStatus: 1 }) # 输出应包含 "ok" : 1 > exit3.5 用户创建与权限加固:从裸奔到最小权限原则
现在,关闭authorization,创建管理员用户:
# 编辑配置文件,取消 security.authorization 的注释 sudo nano /etc/mongod.conf # 找到 #security: 行,删除前面的 #,并确保下一行 # authorization: enabled 的 # 也被删除 # 保存后重启 sudo systemctl restart mongod再连一次:
mongo --host 127.0.0.1:27017 # 创建 root 用户(密码强度必须满足要求:至少 8 位,含大小写字母和数字) > use admin > db.createUser({ ... user: "root", ... pwd: "MongoDB2024!", ... roles: [{ role: "root", db: "admin" }] ... }) # 验证用户 > db.auth("root", "MongoDB2024!") # 输出 1 表示成功 # 退出 > exit现在,客户端必须带认证才能连:
# 正确方式 mongo --host 127.0.0.1:27017 --username root --password MongoDB2024! --authenticationDatabase admin # 错误方式(会报 Unauthorized) mongo --host 127.0.0.1:27017热词里mongodb 命令 db.createuser({ user: "root", pwd: "123456", roles: [{ role: "root", db: "admin" }]})的密码123456太弱,MongoDB 6.0 默认拒绝,必须用强密码。
4. 常见问题与排查技巧实录:那些官方文档不会写的坑
在 Ubuntu 20.04 上部署 MongoDB,最大的陷阱不是技术难点,而是信息差:官方文档假设你懂 systemd,社区教程假设你只用默认配置,而真实世界里,每个环境都有微小差异。我把过去三年帮客户解决的 27 个典型问题,浓缩成这张速查表。每一个都附带现场日志、根本原因、三步修复法。
4.1 启动失败类问题:从日志定位根因
| 现象 | 日志关键词 | 根本原因 | 三步修复 |
|---|---|---|---|
systemctl status mongod显示failed,但journalctl为空 | No journal files were found. | systemd journal 未启用或日志轮转清空 | 1.sudo mkdir -p /var/log/journal2. sudo systemd-tmpfiles --create --prefix /var/log/journal3. sudo systemctl restart systemd-journald |
mongod启动后立即退出,status显示inactive (dead) | child process: failed或exit code: 100 | mongod.conf语法错误,或dbPath目录不存在 | 1.sudo mongod --config /etc/mongod.conf --dryRun2. 检查输出的错误行 3. 修复 YAML 缩进或创建缺失目录 |
journalctl -u mongod显示Failed to bind socket to /tmp/mongodb-27017.sock | socketbindAddress already in use | 端口 27017 被其他进程占用(如旧 mongod 进程) | 1.sudo lsof -i :270172. sudo kill -9 <PID>3. sudo rm -f /tmp/mongodb-27017.sock |
systemctl start mongod报Unit mongod.service not found. | not foundNo such file or directory | mongodb-org包未安装,或安装中断 | 1. `dpkg -l |
