必须使用--uri连接字符串,因mongodump不支持从节点读取且无法自动发现副本集拓扑;--host仅连单点,易连从节点导致失败或数据不一致,--uri才能由驱动层自动定位主节点并确保--oplog等特性生效。

副本集下用 mongodump 导出 BSON 数据,必须显式指定主节点或使用 --uri 连接字符串,否则可能连上从节点导致导出失败或数据不一致。
为什么不能直接用 --host 指从节点地址
副本集里从节点默认开启 readPreference=secondary,但 mongodump 不支持从从节点读取 oplog 或完整快照;若误连从节点,会报错 not master and slaveOk=false 或导出中途中断。
- 即使加了
--readPreference=primary,mongodump也不识别该参数(它不是 mongo shell) - 使用
--host rs01.example.com:27017时,工具不会自动发现副本集拓扑,只连单点 - 正确做法是让驱动层自动发现主节点,这只有
--uri能做到
--uri 是副本集导出的唯一可靠方式
连接字符串必须包含全部种子节点、认证库和 replicaSet 名称,格式严格:
mongodump --uri="mongodb://user:pass@node1:27017,node2:27017,node3:27017/mydb?replicaSet=rs0&authSource=admin" --out ./dump
-
node1~node3是副本集所有可访问成员,至少写两个防单点失效 -
replicaSet=rs0必须与实际配置完全一致(大小写敏感),否则连接超时 -
authSource=admin指定认证数据库,不能省略;若用户建在其他库(如mydb),要改成对应名 - 不推荐在 URI 中 URL 编码密码,容易出错;改用
--username/--password分离传参更稳妥
带 --oplog 的全量备份必须跑在主节点上
启用 --oplog 会额外生成 oplog.bson,记录导出时刻的复制时间戳,用于后续增量恢复。但它有硬性限制:
- 只能在副本集上使用,单机或分片集群直接报错
- 命令必须由主节点执行——如果 URI 解析后连到了从节点,
--oplog会被忽略且无提示 - 导出完成后,用
bsondump ./dump/oplog.bson | head -20检查是否含"ts"字段,确认 oplog 生效 - 若需压缩,
--gzip必须放在--oplog后面,否则部分版本会静默丢弃 oplog 文件
常见权限与网络坑点
副本集环境常因权限或网络策略导致 mongodump 静默失败或卡住:
- 用户角色至少要有
backup或root,仅read不够;clusterAdmin也不行,必须含备份权限 - 防火墙需放行所有副本集节点间通信端口(不只是客户端访问端口),否则 URI 连接发现阶段会超时
- 云数据库(如阿里云 MongoDB)可能禁用
local库访问,此时--oplog一定失败,得换用mongoexport+ 定时快照方案 - 导出大库时加
--numParallelCollections=8加速,但并行数超过副本集连接池上限(默认 100)会触发拒绝连接
真正麻烦的不是语法,而是副本集环境下你根本不知道当前连上的是谁——--uri 是唯一能交由驱动处理拓扑发现的方式,其他参数都是在赌运气。











