更新时间:2026-04-29 GMT+08:00
删除分片进度确认与异常排查指南
操作场景
本文旨在帮助您在执行删除分片操作时,排查任务阻塞的原因,并提供相应的解决方法。
待删除分片为主分片导致任务失败
- 待删除分片上存在未分片集合,建议您优先评估使用DRS迁移到新实例。
- 待删除分片上没有未分片集合,可以通过执行movePrimary命令切换主分片(注:此命令迁移非分片集合时会阻塞正常业务,因此默认情况下是禁用状态)。
存在Jumbo Chunk导致任务失败
推荐解决方法:
- 建议您优先评估使用DRS迁移到新实例,并重新设计分片键,以防止新实例产生Jumbo Chunk。
- 如果业务条件允许,建议自行删除Jumbo Chunk中的部分数据,以减小其尺寸。
存在duplicated key(_id) 导致任务失败
- 一般是由于孤儿文档导致,建议客户先清理孤儿文档。请参考清理孤儿文档。
- 如果已清理孤儿文档仍失败,建议客户根据集合执行以下命令,检查发生冲突的键值。如果业务允许,请删除不必要的文档后重试任务。
db.getSiblingDB("test").coll.aggregate([{$group: { _id: "$_id", count: { $sum: 1 }}},{$match: { count: { $gt: 1 } }}], {allowDiskUse: true})上述命令的执行计划为全表扫描(COLLSCAN),这将占用较多的CPU和内存资源,执行时间与数据量密切相关。建议在业务低峰期执行该命令。
- 根据2返回结果,请根据实际业务情况选择删除冲突的文档。
确认均衡器的状态
- 通过Mongo Shell连接集群实例。
- 执行如下命令,获取balancer的状态。
sh.startBalancer()
- 结果返回true表示balancer处于开启状态,如需关闭,请参考关闭Balancer。
关闭Balancer
- 通过Mongo Shell连接集群实例。
- 在dds mongos节点命令行中,切换至config数据库。
use config
- 执行如下命令,查看Balancer运行状态。
while(sh.isBalancerRunning()){ print("waiting..."); sleep(500); }- 如果返回值为空,则表示Balancer未处于执行任务的状态,此时可以进行下一步操作,关闭Balancer。
- 如果返回值为 "waiting",则表示 Balancer 正在执行块迁移。此时,不应执行关闭 Balancer 的命令,否则可能会导致数据不一致。
- 如3执行的命令后返回的值为空,可执行关闭Balancer命令。
sh.stopBalancer()
- 如需开启Balancer,请执行如下命令。
sh.startBalancer()
删除分片任务进度
- 通过Mongo Shell连接集群实例。
- 查看删减分片上需要迁移的 Chunks 数量。
db.getSiblingDB("config").chunks.aggregate([{$match: {ns: "test.coll", shard: "shard_3"}},{$group: {_id: "$ns", count: {$sum: 1}}}]) { "_id" : "db.coll", "count" : 1 } - 执行如下命令,查看迁移速率,查询过去24小时的迁移的 Chunk 数量。
sh.status()

- 在理想情况下(业务负载稳定,Chunk 总数不变),您可以根据上述信息进行估算:
预计完成时间 ≈ 需迁移 Chunk 数 / 过去24小时迁移的 Chunk 数
例如:需迁移 Chunk 数 = 1000,过去24小时迁移的 Chunk 数 = 500,则预计完成时间为:1000 / 500 = 2 (天)。
父主题: 变更集群实例的节点