使用--host选项无法连接MongoDB Atlas,--uri选项正常,求排查问题
问题场景
使用--uri选项可正常执行备份:
mongodump --uri="mongodb+srv://<用户名>:<密码>@<主机名>/<数据库名>" --gzip --out=/dir1/dir2
但使用--host选项时出现连接错误:
Failed: error connecting to db server: no reachable servers
(中文翻译:失败:连接数据库服务器出错:无可用服务器)
对应的--host命令:
mongodump --host <主机名>:<端口> --username <用户名> --password <密码> --authenticationDatabase <数据库用户名> --gzip --db <数据库名> --out /dir/dir2
核心错误点及修复方案
1. SRV记录解析缺失
MongoDB Atlas集群依赖SRV域名记录管理多节点副本集,mongodb+srv://协议会自动解析这条记录,获取集群所有节点地址、副本集名称、SSL要求等配置。但直接用--host填<主机名>:<端口>时,只会尝试连接单个节点,无法获取集群完整配置,导致连接失败。
2. 认证数据库参数错误
你的--authenticationDatabase填了<数据库用户名>,这是错误的。MongoDB Atlas的用户认证默认都在admin数据库下,这个参数必须设为admin。
3. 缺少SSL强制配置
Atlas要求所有连接必须使用SSL,mongodb+srv://会自动启用SSL,但--host模式下需要手动添加--ssl参数。
4. 连接格式不符合集群要求
用--host连接Atlas集群,必须指定完整的副本集连接字符串,格式为:"<副本集名称>/<节点1>:27017,<节点2>:27017,..."
你可以通过以下命令解析SRV记录获取副本集名称和节点列表:
nslookup -type=SRV _mongodb._tcp.<你的主机名>
正确的--host命令示例
假设解析后得到副本集名称为atlas-xxxxxx-shard-0,节点列表为atlas-xxxxxx-shard-00-00.mongodb.net:27017,atlas-xxxxxx-shard-00-01.mongodb.net:27017,atlas-xxxxxx-shard-00-02.mongodb.net:27017,则正确命令为:
mongodump --host "atlas-xxxxxx-shard-0/atlas-xxxxxx-shard-00-00.mongodb.net:27017,atlas-xxxxxx-shard-00-01.mongodb.net:27017,atlas-xxxxxx-shard-00-02.mongodb.net:27017" --username <用户名> --password <密码> --authenticationDatabase admin --ssl --gzip --db <数据库名> --out /dir/dir2
更省心的替代方案
既然--uri可以正常工作,直接使用它是最优选择——它已经封装了所有集群配置、SSL、认证参数,不需要手动拆分,避免出错。
内容的提问来源于stack exchange,提问作者Krishnakumar

