mergeChunks
定义
mergeChunks
对于分片的集合, 会将分片上连续的
mergeChunks
数据块范围分片为单个数据块。从mergeChunks
admin
实例对mongos
数据库发出 命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
mergeChunks
采用以下形式:
db.adminCommand( { mergeChunks : <namespace> , bounds : [ { <shardKeyField>: <minFieldValue> }, { <shardKeyField>: <maxFieldValue> } ] } )
对于复合分片键,您必须在bounds
规范中包含完整的分片键。 例如,如果分片键为{ x: 1, y:
1 }
,则mergeChunks
的形式如下:
db.adminCommand( { mergeChunks : <namespace> , bounds : [ { x: <minValue>, y: <minValue> }, { x: <maxValue>, y: <maxValue> } ] } )
命令字段
mergeChunks
命令采用以下字段:
字段 | 类型 | 说明 |
---|---|---|
| namespace | 两个数据块都 存在 的collection的完全限定 命名空间 。命名空间采用 |
| 阵列 | 包含新数据段的最小和最大键值的数组。 |
访问控制
在使用authorization
运行的部署中,内置角色clusterManager
提供所需的权限。
行为
注意
仅在特殊情况下使用mergeChunks
。 例如,在删除许多文档后清理分片集群时。
为了成功合并数据块,必须满足以下条件:
在
bounds
字段中,<minkey>
和<maxkey>
必须对应于要合并的数据块的下限和上限。这些数据段必须驻留在同一分片上。
数据块必须是连续的。
mergeChunks
如果不满足这些条件,则会返回错误。
返回消息
成功后, mergeChunks
将返回此文档:
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1510767081, 1), "signature" : { "hash" : BinData(0,"okKHD0QuzcpbVQg7mP2YFw6lM04="), "keyId" : NumberLong("6488693018630029321") } }, "operationTime" : Timestamp(1510767081, 1) }
另一项操作正在进行中
mergeChunks
如果正在对chunks
集合执行另一个元数据操作, 将返回以下错误消息:
errmsg: "The collection's metadata lock is already taken."
如果其他进程(例如负载均衡器进程)在mergeChunks
运行时更改元数据,则可能会看到此错误。 您可以重试mergeChunks
操作,不会产生副作用。
不同分片上的数据块
如果输入数据段不在同一分片上, mergeChunks
将返回类似于以下内容的错误:
{ "ok" : 0, "errmsg" : "could not merge chunks, collection test.users does not contain a chunk ending at { username: \"user63169\" }", "$clusterTime" : { "clusterTime" : Timestamp(1510767081, 1), "signature" : { "hash" : BinData(0,"okKHD0QuzcpbVQg7mP2YFw6lM04="), "keyId" : NumberLong("6488693018630029321") } }, "operationTime" : Timestamp(1510767081, 1) }
非连续数据块
如果输入数据段不连续, mergeChunks
将返回类似于以下内容的错误:
{ "ok" : 0, "errmsg" : "could not merge chunks, collection test.users has more than 2 chunks between [{ username: \"user29937\" }, { username: \"user49877\" })" "$clusterTime" : { "clusterTime" : Timestamp(1510767081, 1), "signature" : { "hash" : BinData(0,"okKHD0QuzcpbVQg7mP2YFw6lM04="), "keyId" : NumberLong("6488693018630029321") } }, "operationTime" : Timestamp(1510767081, 1) }