Navicat 16 连接 MongoDB 副本集必须使用 mongodb:// 协议手动拼写含 replicaSet 参数的连接串,mongodb+srv:// 不支持副本集发现;需逗号分隔多节点、显式指定 ?replicaSet=rs0、authSource=admin、密码 URL 编码,并正确配置 SSL(Require 模式+CA 文件)。

Navicat 16 连接 MongoDB 副本集必须用 mongodb:// 或 mongodb+srv://?
必须用 mongodb:// 协议手动拼写副本集连接串,mongodb+srv:// 不支持副本集发现(SRV 记录只用于单机或 Atlas 自动发现)。Navicat 16 的 MongoDB 连接界面不提供“副本集模式”开关,它靠解析 URI 中的 replicaSet 参数识别——你填的不是单个 IP,而是逗号分隔的多个 host:port,并显式带上 ?replicaSet=rs0,它才走副本集逻辑。
常见错误:直接把 Atlas 复制的 mongodb+srv://... 粘贴进 Navicat 的“主机”字段,结果连上但始终显示 SECONDARY 或报 not master——因为 Navicat 把它当普通单节点处理,没触发 replica set discovery。
- 正确格式示例:
mongodb://node1.example.com:27017,node2.example.com:27017,node3.example.com:27017/admin?replicaSet=rs0&authSource=admin - “Database”字段填
admin或你目标库名,但它不参与认证;真正决定认证上下文的是 URI 里的authSource参数 - 副本集所有节点必须能互相 TLS 握手,且客户端(Navicat)访问任一节点时,该节点证书的 SAN 必须包含你实际连接的那个 host 名或 IP
SSL 开关、协议选项与 CA 文件三者必须同时对齐
Navicat 16 对 MongoDB 的 SSL 控制粒度比旧版更细,光勾“Use SSL”不够,Protocol 和 CA 配置错一个,就会静默失败或卡在 TLS handshake timeout。
- 本地自建副本集启用 TLS:勾选
Use SSL,Protocol选Require(不能选Preferred),并填入CA File路径(即你自建 CA 的ca.crt) - 云服务(如阿里云 MongoDB 版、Atlas):同样选
Require,但CA File可留空——Let’s Encrypt 证书系统自带信任链;若提示certificate verify failed,再下载isrgrootx1.pem填入 - 绝对不要勾
Validate Certificate后又不填 CA File,这会导致 Navicat 尝试用系统默认根证书校验,而自建 CA 或私有云证书必然失败 - 密码含
@、/、:时,只对密码部分做 URL 编码:encodeURIComponent('mypass@123/abc')→mypass%40123%2Fabc,否则 URI 解析错位,认证直接失败
authSource 配错是副本集连接后“空库”或 listDatabases 权限拒绝的主因
Navicat 一连接就执行 listDatabases,这个命令需要用户在 authSource 数据库中拥有 clusterAdmin 或 root 角色。副本集用户几乎全在 admin 库创建,所以 URI 必须带 &authSource=admin;填在 Navicat 界面的 “Authentication Database” 字段也得是 admin,二者要一致。
- 现象:连接提示“成功”,但左侧数据库列表为空,点任意库报
[13] unauthorized: command listDatabases requires authentication - 云服务例外:Atlas 要求
authSource=$external,且不能手动加?authSource=...到 SRV URI 后——SRV 已隐含,硬加会破坏解析 - 副本集内部通信(节点间心跳、oplog 拉取)不经过 Navicat,但如果你的
net.tls.clusterFile没配或配错,从节点可能卡在STARTUP2,此时 Navicat 连主节点虽能读写,但数据同步已中断
副本集连接成功但总连到 SECONDARY 怎么办
Navicat 本身不控制读偏好(readPreference),它默认走 MongoDB 驱动的默认行为:优先连 PRIMARY,但连接建立后不自动重定向。如果看到状态栏显示 SECONDARY,说明 Navicat 当前连的是从节点——这不是配置错误,而是 DNS 轮询或你 URI 里第一个地址恰好是 SECONDARY。
- 临时解决:双击连接后,在顶部菜单选
Connection→Reconnect,驱动会重新发现 PRIMARY 并切换 - 长期办法:确保 URI 中节点顺序按预期排列,或改用
readPreference=primary参数(Navicat 16 支持在 URI 末尾加,如&readPreference=primary) - 注意:即使连上 SECONDARY,只要没显式设置
setSecondaryOk(),写操作仍会报错;Navicat 执行插入时自动检测角色,所以写失败大概率是你正连着从节点且没设读偏好
authSource 和 replicaSet 参数缺一不可,且 CA 文件路径必须可读、证书 SAN 必须覆盖你输入的 host 名——哪怕只差一个域名后缀,TLS 就会断在握手阶段。


















