不能直接修改MongoDB副本集名称,唯一安全路径是停服→导出→清空→重初始化→导入;因replSetName是底层身份标识,rs.reconfig()修改会触发校验失败,强制更改将导致同步中断、主节点降级。

不能直接修改 MongoDB 副本集名称(replSetName),它写死在每个节点的配置、本地 local.system.replset 集合、oplog 及所有成员间通信中。强行改配置重启会导致初始化失败、数据不可用甚至脑裂。唯一安全路径是:停服 → 导出 → 清空 → 重初始化 → 导入。
为什么 rs.reconfig() 不能改副本集名
副本集名称是成员身份的底层标识,不是可热更新的配置项。调用 rs.reconfig() 修改 _id 字段会触发 InvalidReplicaSetConfig: replSetName does not match 错误,所有节点拒绝加入新配置。即使绕过校验强制写入,oplog 时间戳和心跳协议也会立即中断同步,secondary 无法追赶,primary 自动降级。
导出时必须用 mongodump 的 --forceTableScan 和 --excludeCollection
local 数据库包含复制元数据(system.replset、oplog.rs),不能也不该导出;但默认 mongodump 在分片或有特殊索引时可能跳过某些文档。生产环境务必加:
-
--forceTableScan:避免因 orphaned documents 或 stale metadata 导致漏数据 -
--excludeCollection=system.replset --excludeCollection=oplog.rs:显式排除复制专用集合 -
--gzip --archive=db_backup.archive:压缩归档,减少 I/O 和磁盘占用
不要用 mongoexport —— 它只导集合数据,丢掉索引、权限、TTL 设置等关键结构。
重初始化前要清空 dbPath 并检查 bindIp 和 port
旧副本集残留的 WiredTiger.wt、_mdb_catalog.wt 文件会干扰新初始化。必须彻底清空 dbPath 目录(不是只删 data 子目录):
- 确认
mongod已完全停止:ps aux | grep mongod+kill -2后等待进程退出 - 执行
rm -rf /var/lib/mongodb/*(路径按实际配置) - 检查
mongod.conf中net.bindIp是否为127.0.0.1或具体内网 IP,禁止0.0.0.0上线;port需与旧集群一致,否则应用连接字符串要全量更新 - 启动前用
mongod --config /etc/mongod.conf --dryRun验证配置语法
导入后需重建索引并验证 readPreference 行为
mongorestore 默认不重建索引(除非加 --noIndexRestore 反向操作),必须手动触发:
- 导入后连接 primary,对每个集合运行
db.collection.getIndexes()确认数量匹配 - 对大集合,用
db.collection.createIndex({...}, {background: true})避免阻塞 - 重点验证应用层
readPreference=secondaryPreferred是否仍能路由到 secondary:旧客户端驱动可能缓存了 replica set name,需重启应用或刷新 DNS 缓存 - 检查
rs.status().members[n].stateStr全为PRIMARY/SECONDARY,无STARTUP2卡住
真正麻烦的不是步骤本身,而是所有节点必须严格同步执行顺序:任意一个节点漏删 dbPath 或导入时连错端口,整个副本集就再也无法达成多数派投票 —— 这种故障没有回退键,只能重来。

















