split
定义
split
将数据分片在分片集群中拆分为两个数据分片。分片根据它们维护的数据分片大小统计数据来管理和拆分数据分片。
在特殊情况下,
split
命令允许管理员手动创建拆分。有关这些情况以及包含split
.split
命令必须在admin
数据库中运行。提示
在
mongosh
中,此命令也可以通过sh.splitAt()
和sh.splitFind()
辅助方法运行.辅助方法对
mongosh
用户很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。
兼容性
此命令在以下环境中托管的部署中可用
MongoDB Atlas:云中MongoDB部署的全托管服务
重要
此命令不支持在无服务器实例中使用。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的、自我管理的MongoDB版本
MongoDB Community:源代码可用的、免费使用和自我管理的MongoDB版本
语法
该命令有以下语法
db.adminCommand( { split: <database>.<collection>, <find|middle|bounds> } )
命令字段
命令接受以下字段
字段 | 类型 | 描述 |
---|---|---|
split | 字符串 | |
查找 | 文档 | 一个查询语句,用于指定对分片键的相等匹配。该匹配选择包含指定文档的块。您必须指定以下选项之一: 在空集合上不能使用 |
bounds | 数组 |
在空集合上不能使用 |
middle | 文档 |
注意事项
当与find
或bounds
选项一起使用时,split
命令会在中值处分割块。因此,该命令不能使用find
或bounds
选项来分割空块,因为空块没有中值。
要在空块中创建分割,请使用split
命令的middle
选项,或者使用sh.splitAt()
命令。
命令格式
要创建一个数据块分割,连接到mongos
实例,并向admin
数据库发出以下命令
db.adminCommand( { split: <database>.<collection>, find: <document> } )
或者
db.adminCommand( { split: <database>.<collection>, middle: <document> } )
或者
db.adminCommand( { split: <database>.<collection>, bounds: [ <lower>, <upper> ] } )
要为使用散列分片键的集合创建分割,使用bounds
参数。为此目的,不要使用middle
参数。
警告
在分片集合中拆分数据以创建新数据块时要小心。当您对具有现有数据的集合进行分片时,MongoDB会自动创建数据块以均匀分布集合。为了在分片集群中有效地拆分数据,您必须考虑数据块中的文档数量和平均文档大小以创建均匀的数据块大小。当数据块大小不规则时,分片可能具有相同数量的数据块,但数据大小可能非常不同。避免创建导致集合具有不同大小数据块的分割。
示例
以下部分提供了split
命令的示例。
将数据块分成两半
db.adminCommand( { split : "test.people", find : { _id : 99 } } )
命令 split
识别 test
数据库中 people
集合中包含匹配 { _id : 99 }
的文档的数据块。命令 split
不需要存在匹配项来识别适当的块。然后命令将其分成两个大小相等的块。
注意
命令 split
通过范围而不是大小创建两个相等的块,并且不使用选定点作为新块的边界。
定义任意分割点
要定义一个任意的分割点,使用以下形式
db.adminCommand( { split : "test.people", middle : { _id : 99 } } )
命令 split
识别 test
数据库中 people
集合中将要包含匹配查询 { _id : 99 }
的文档的数据块。命令 split
不需要存在匹配项来识别适当的块。然后命令将其分成两个块,匹配文档作为其中一个分割块的底部边界。
此形式通常用于在集合中预分割数据。
根据哈希分片键的值拆分数据块
此示例使用一个测试数据库中 people
集合的 哈希分片键 userid
。以下命令使用一个包含两个单字段文档的数组来表示哈希分片键的最小和最大值,以拆分数据块
db.adminCommand( { split: "test.people", bounds : [ { userid: NumberLong("-5838464104018346494") }, { userid: NumberLong("-5557153028469814163") } ] } )
注意
MongoDB 使用 64 位的 NumberLong 类型来表示哈希值。
使用 sh.status()
查看现有分片键的范围。
元数据锁定错误
如果另一个进程(如平衡器进程)在 split
运行时更改元数据,您可能会看到一个 元数据锁定错误
。
errmsg: "The collection's metadata lock is already taken."
此消息表示拆分失败,没有副作用。重试 split
命令。