Navicat 17 连接 MongoDB 6.0 副本集必须使用完整 URI 字符串,因旧版“复制集”勾选框依赖过时驱动,无法正确解析拓扑;URI 必须含 mongodb:// 协议、逗号分隔的 host:port 列表、显式 ?replicaSet=xxx、URL 编码的用户名密码、以及明确指定的 authSource=admin 和 SSL 配置,否则将导致故障转移失效、库列表为空或认证失败。

Navicat 17 连接副本集 MongoDB 6.0,必须用 URI 模式填完整连接字符串,不能只填单个 host + “复制集”开关;否则会连上主节点但无法自动故障转移或列出全部数据库。
为什么 Navicat 17 的“复制集”选项在 MongoDB 6.0 上基本失效
Navicat 界面里那个带“Replica Set”勾选框的连接方式,底层是尝试用旧版驱动解析 host 列表并拼接 replicaSet=xxx 参数,但 MongoDB 6.0+ 默认要求严格匹配 mongodb:// URI 格式,且驱动对拓扑发现逻辑更敏感。实测中,即使填了三个地址、勾了复制集、写了名称,Navicat 仍可能只连第一个节点、忽略其他成员,导致:主节点宕机后连接中断、rs.status() 看不到 secondary、admin 库里用户认证失败。
真正可靠的方式是直接使用 URI 输入框(Navicat 17 支持),把所有节点和参数写死在字符串里。
URI 字符串必须包含哪些关键字段
一个能稳定连接 MongoDB 6.0 副本集的 URI 至少要满足以下条件:
-
mongodb://开头,不是mongo://或空协议 - 所有节点用英文逗号分隔,格式为
host:port,例如192.168.1.10:27017,192.168.1.11:27017,192.168.1.12:27017 - 必须显式带上
?replicaSet=rs0(值替换成你实际的 replica set 名称) - 用户名密码需 URL 编码,比如密码
pa@ss/word要写成pa%40ss%2Fword - authSource 必须明确指定,通常为
admin,不能省略 —— 即使你连的是test库,认证也得去admin找用户
正确示例:mongodb://admin:pa%40ss%2Fword@192.168.1.10:27017,192.168.1.11:27017,192.168.1.12:27017/admin?replicaSet=rs0&authSource=admin
SSL 和 authSource 配置错一个就白忙
MongoDB 6.0 副本集默认启用 net.ssl.mode: requireSSL(尤其云环境或自建启用了 TLS),而 Navicat 17 的 SSL 开关位置藏得深:不在主连接页,而在“高级”→“SSL”子页里。常见错误包括:
- 本地测试副本集却开了
Require SSL→ 连接卡在 handshake timeout,日志里看不到明确报错 - 云服务(如 Atlas)没填
authSource=$external,而是沿用admin→ 显示“connected”,但左侧库列表为空 - 开启了
Validate Certificate却没导入 CA 证书路径(如/path/to/atlas-root-ca.pem)→ 认证阶段直接断开
判断依据很简单:如果 Navicat 测试连接弹出“连接成功”,但数据库树形列表里一个库都不显示,90% 是 authSource 或 SSL 配置不匹配。
连接后看不到集合?先确认用户权限是否绑定到 admin 数据库
副本集环境下,用户必须在 admin 库创建,并赋予跨库权限。仅用 db.createUser(...) 在 test 库建用户,Navicat 就算连上也查不到任何 collection。
检查方法:在 mongo shell 中执行
use admin
db.runCommand({connectionStatus: 1})
看返回里的 authInfo.db 是否为 admin,以及 authenticatedUsers 数组是否包含你的用户名。如果不是,说明认证根本没走对库,URI 里的 authSource=admin 被忽略了 —— 很可能是密码没 URL 编码,导致解析器把 @ 当作 host 分隔符截断了。
副本集连接真正的难点不在填几个 IP,而在于 URI 字符串里每个符号都承担语义责任:斜杠、问号、等号、逗号、百分号,错一位就跳到另一个解析分支。建议把完整 URI 先在终端用 mongosh 测试通了,再粘进 Navicat。


















