我在 4.2 版中尝试了几个选项来执行此操作。
最后,我结束了这些要在 Config Server 上执行的命令:
use config
db.databases.updateMany( {primary: "shard0002"}, {$set: {primary: "shard0000"} })
db.shards.deleteOne({_id : "shard0002" })
db.chunks.updateMany( {shard : "shard0002"}, {$set: {shard: "shard0000"} })
while ( db.chunks.updateMany( {"history.shard" : "shard0002"},
{$set: {"history.$.shard": "shard0000"} }).modifiedCount > 0 ) { print("Updated") }
它在一定程度上起作用,即 CRUD 操作正在起作用。但是,当您运行时,getShardDistribution()
您会收到错误Collection 'db.collection' is not sharded。
最后,我只看到一个可靠且安全的解决方案:
- 关闭分片集群中的所有 mongod 和 mongos
- 将可用分片作为独立服务启动(请参阅对副本集成员执行维护)
- 使用 .从可用分片中进行备份
mongodump
。
- 从所有主机中删除数据文件夹。
- 从头开始构建您的应用程序。启动所有 mongod 和 mongos
- 将数据加载到新集群中
mongorestore
也许对于大型集群,您必须像这样洗牌:
- 部署 Config 服务器和 mongos 服务器,一个空分片
- 独立启动一个旧分片
- 从这个旧碎片中备份
- 拆掉这个旧碎片
- 建立一个全新的空分片
- 将新分片添加到新集群
- 将数据恢复到新集群
- 可以删除备份并且可以在新集群中重用分片
- 对集群中的每个分片重复上述操作(最有可能跳过损坏的分片)