moveChunk
定义
moveChunk
内部管理命令。在分片之间移动数据块。在使用分片时,通过一个
mongos
实例发出moveChunk
命令,并使用管理数据库。使用以下形式提示
在
mongosh
中,此命令也可以通过sh.moveChunk()
辅助方法运行.辅助方法对于
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。db.adminCommand( { moveChunk : <namespace> , find : <query> , to : <string>, forceJumbo: <boolean>, _secondaryThrottle : <boolean>, writeConcern: <document>, _waitForDelete : <boolean> } ) 或者
db.adminCommand( { moveChunk : <namespace> , bounds : <array> , to : <string>, forceJumbo: <boolean>, _secondaryThrottle : <boolean>, writeConcern: <document>, _waitForDelete : <boolean> } ) moveChunk
命令具有以下字段字段类型描述moveChunk
stringfind
document对指定要移动的数据分片 shard-key 值的 shard-key 进行相等匹配。指定bounds
字段或find
字段,但不能同时指定两者。不要使用find
字段来选择使用 哈希分片键 的集合中的数据分片。bounds
array要移动的特定数据分片的边界。数组必须包含两个文档,分别指定要移动的数据分片的下界和上界 shard-key 值。指定bounds
字段或find
字段,但不能同时指定两者。使用bounds
来选择使用 哈希分片键 的集合中的数据分片。to
string数据分片的目标分片名称。boolean可选。一个标志,用于确定是否可以移动一个太大而无法迁移的 数据分片。该数据分片可能或可能不是标记为 大分片。
如果设置为
true
,则可以移动数据分片。如果设置为
false
,则无法移动数据分片。
默认值为
false
。警告
带有
forceJumbo=true
的moveChunk
命令将阻止集合上的读写操作。此选项会导致即使数据分片大于配置的块大小,分片也会迁移数据分片。在迁移期间,集合将不可用。
要避免这种长时间的阻塞期迁移这些大型数据分片,请参阅 平衡超过大小限制的范围。
_secondaryThrottle
boolean可选。对于 WiredTiger,默认为
false
。如果设置为
true
,则在迁移数据分片期间,每个文档的移动默认至少传播到辅助副本一次,然后平衡器才继续下一个文档。这相当于一个写关注为{ w: 2 }
的写操作。使用
writeConcern
选项指定不同的写关注。如果设置为
false
,则平衡器不会等待复制到辅助副本,而是继续下一个文档。
有关更多信息,请参阅 辅助副本节流。
writeConcern
document可选。一个表达
_secondaryThrottle
在块迁移期间等待副本将使用的 写关注 的文档。writeConcern
需要_secondaryThrottle: true
。_waitForDelete
booleanbounds
的值采用以下形式[ { hashedField : <minValue> } , { hashedField : <maxValue> } ] 关于 块迁移 的部分描述了在 MongoDB 中块如何在分片之间移动。
兼容性
此命令在以下环境中托管的服务器中可用
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
重要
此命令不支持在无服务器实例中。有关更多信息,请参阅 不受支持的命令。
MongoDB Enterprise:基于订阅的、自管理的 MongoDB 版本
MongoDB Community:开源的、免费使用的、自管理的 MongoDB 版本
注意事项
仅在特殊情况下使用 moveChunk
,例如准备你的 分片集群 进行初始数据导入,或者进行大量批量导入操作。在大多数情况下,允许均衡器在分片集群中创建和平衡数据块。有关更多信息,请参阅 在分片集群中创建范围。
行为
索引
moveChunk
在迁移之前需要在目标(即 to
)分片上存在所有索引,如果缺少所需的索引将返回错误。
元数据错误
moveChunk
在 chunks
集合中存在其他元数据操作时,会返回以下错误信息
errmsg: "The collection's metadata lock is already taken."
如果其他进程,例如均衡器进程,在 moveChunk
运行时更改元数据,您可能会看到此错误。您可以尝试再次执行 moveChunk
操作,而不会产生副作用。
maxCatchUpPercentageBeforeBlockingWrites
服务器参数
从 MongoDB 5.0 开始,您可以将 maxCatchUpPercentageBeforeBlockingWrites
设置为在 moveChunk
操作期间,与传输块的总大小(以 MB 为单位)相比,允许的最大未迁移数据百分比。