mergeChunks
定义
mergeChunks
对于分片集合,
mergeChunks
将连续的数据分片范围合并为单个数据分片。在mergeChunks
命令中,从mongos
实例上的admin
数据库执行。
兼容性
此命令在以下环境中的部署中可用
MongoDB Atlas:云中MongoDB部署的全面托管服务
重要
此命令不支持在无服务器实例上。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的自托管MongoDB版本
MongoDB Community:源代码可用的免费使用、自托管MongoDB版本
语法
命令有以下语法
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 | 包含两个数据分片的全限定 命名空间。命名空间的格式为 <数据库名>.<集合名> 。 |
bounds | 数组 | 包含新数据分片的最小和最大键值的数组。 |
访问控制
在启用 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) }