文档菜单
文档首页
/
MongoDB 手册
/ / /

mergeChunks

本页内容

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 访问控制
  • 行为
  • 返回消息
mergeChunks

对于分片集合,mergeChunks 将连续的数据分片范围合并为单个数据分片。在mergeChunks 命令中,从mongos 实例上的 admin 数据库执行。

此命令在以下环境中的部署中可用

  • MongoDB Atlas:云中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)
}

返回

moveRange