已添加分片集,mongos创建shard key时提示Cannot accept sharding commands if not started with --shardsvr
问题分析与解决
错误原因
报错Cannot accept sharding commands if not started with --shardsvr的核心问题是:你执行分片命令的目标不是mongos路由节点,而是直接连接到了某个分片副本集的节点上。分片节点仅负责存储数据,不处理全局分片配置命令,这类操作必须通过mongos执行。
集群配置信息(中文翻译)
分片版本 { _id: 1, 最低兼容版本: 5, 当前版本: 6, 集群ID: ObjectId("640aa3247a56905aabdee85b") } --- 分片列表 [ { _id: 'shard1', 主机地址: 'shard1/shard1-server1:27017,shard1-server2:27017', 状态: 1, 拓扑时间: Timestamp({ t: 1678440200, i: 4 }) }, { _id: 'shard2', 主机地址: 'shard2/shard2-server1:27017,shard2-server2:27017', 状态: 1, 拓扑时间: Timestamp({ t: 1678440295, i: 5 }) }, { _id: 'shard3', 主机地址: 'shard3/shard3-server1:27017,shard3-server2:27017', 状态: 1, 拓扑时间: Timestamp({ t: 1678440595, i: 4 }) } ] --- 活跃mongos节点 [ { '6.0.4': 1 } ] --- 自动分片 { '当前启用状态': '否' } --- 均衡器 { '当前启用状态': '否', '当前运行状态': '否', '最近5次尝试中均衡失败次数': 0, '过去24小时迁移结果': '无近期迁移' } --- 数据库列表 [ { 数据库: { _id: 'config', 主节点: 'config', 已分片: true }, 集合: { 'config.system.sessions': { 分片键: { _id: 1 }, 唯一约束: false, 均衡状态: true, 块元数据: [ { 分片: 'shard1', 块数量: 1024 } ], 块列表: [ '块数量过多,无法打印,如需强制打印请使用verbose参数' ], 标签: [] } } }, { 数据库: { _id: 'pdmp', 主节点: 'shard2', 已分片: false, 版本信息: { uuid: new UUID("988c9ba7-efe9-45b1-97af-c786c9c407e7"), 时间戳: Timestamp({ t: 1678850827, i: 2 }), 最后修改版本: 1 } }, 集合: {} }, { 数据库: { _id: 'pro', 主节点: 'shard3', 已分片: false, 版本信息: { uuid: new UUID("0088a7d2-6628-4cdf-8cf4-a522dca6befc"), 时间戳: Timestamp({ t: 1678866415, i: 1 }), 最后修改版本: 1 } }, 集合: {} }, { 数据库: { _id: 'test', 主节点: 'shard3', 已分片: false, 版本信息: { uuid: new UUID("8b3bc5d8-58d0-420e-9b59-07d9100f0eee"), 时间戳: Timestamp({ t: 1678850901, i: 1 }), 最后修改版本: 1 } }, 集合: {} } ]
解决步骤
连接到正确的mongos节点
检查Mongo Shell连接命令,确保目标是mongos的地址和端口,而非分片节点。例如:mongosh mongos-container-name:27017若mongos使用自定义端口,替换为对应端口即可。
验证mongos连接有效性
在mongos中执行sh.status(),如果能返回你提供的集群配置,说明连接正确。重新执行分片命令
以pdmp库为例,执行以下操作:// 启用数据库分片 sh.enableSharding("pdmp") // 为集合创建分片键(替换为你的集合名和分片键) sh.shardCollection("pdmp.your_collection", {"your_shard_key": 1})可选配置优化
- 开启自动分片:
sh.enableAutoSplit() - 启动均衡器:
sh.startBalancer()
- 开启自动分片:
内容的提问来源于stack exchange,提问作者yunxiang zhou
相关产品推荐
相关产品推荐

