On this page
mergeChunks
在本页面
Definition
mergeChunks
- 对于分片集合,mergeChunks将分片上的连续chunk范围合并为一个块。从mongos实例对
admin
数据库发出mergeChunks命令。
- 对于分片集合,mergeChunks将分片上的连续chunk范围合并为一个块。从mongos实例对
Syntax
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> } ] } )
Command Fields
mergeChunks命令具有以下字段:
Field | Type | Description |
---|---|---|
mergeChunks |
namespace | 两个chunks都存在的collection中的完全合格的namespace。命名空间采用<database>.<collection> 的形式。 |
bounds |
array | 包含新块的最小和最大键值的数组。 |
Access Control
在以authorization运行的部署中,用户必须具有包括以下特权的访问权限:
- 对集合执行splitChunk操作。
内置角色clusterManager提供所需的特权。
Behavior
Note
仅在特殊情况下使用mergeChunks。例如,在删除许多文档后清理sharded cluster时。
为了成功合并块,以下必须为真:
在
bounds
字段中,<minkey>
和<maxkey>
必须与要合并的chunks的上下边界相对应。这些块必须驻留在同一分片上。
这些块必须是连续的。
如果不满足这些条件,mergeChunks将返回错误。
Return Messages
成功后,mergeChunks返回到以下文档:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1510767081, 1),
"signature" : {
"hash" : BinData(0,"okKHD0QuzcpbVQg7mP2YFw6lM04="),
"keyId" : NumberLong("6488693018630029321")
}
},
"operationTime" : Timestamp(1510767081, 1)
}
正在进行另一项操作
如果在chunks集合上正在进行其他元数据操作,则mergeChunks返回以下错误消息:
errmsg: "The collection's metadata lock is already taken."
如果另一个进程(例如 balancer 进程)在mergeChunks运行时更改了元数据,则可能会看到此错误。您可以重试mergeChunks操作,而不会产生副作用。
不同碎片上的块
如果 Importingchunks不在同一shard上,则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)
}
Noncontiguous Chunks
如果 Importingchunks不连续,则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)
}