movePrimary
movePrimary
在分片集群中,
movePrimary
重新分配用于保存数据库中所有未分片集合的主分片分片。movePrimary
首先更改集群元数据中的主分片分片,然后将所有未分片集合迁移到指定分分片。 使用以下形式的命令:db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } ) 例如,以下命令将主分片从
test
移动到shard0001
:db.adminCommand( { movePrimary : "test", to : "shard0001" } ) 当命令返回时,数据库的主分片位置已切换到指定的分片。 要完全停用分片,请使用
removeShard
命令。movePrimary
是管理命令,仅适用于mongos
实例。警告
启动
movePrimary
后,在该命令完成之前,请勿对该数据库中的任何未分片集合执行任何读取或写入操作。 迁移期间对这些集合发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
Considerations
mongos
对 使用"majority"
movePrimary
写关注。
movePrimary
在维护窗口期间发出
movePrimary
可能需要很长时间才能完成,具体取决于数据库的大小以及网络运行状况或计算机资源等因素。 迁移期间对数据库发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。
请考虑安排一个维护窗口,在此期间应用程序会停止对集群的所有读取和写入。 在计划内停机期间发出movePrimary
可以降低由于交叉读取或写入数据库中的未分片集合而导致出现未定义行为的风险。
命名空间冲突阻止迁移
movePrimary
如果目标分片包含有冲突的collection命名空间,则会失败。例如:
管理员发出
movePrimary
来更改hr
数据库的主分片。当
movePrimary
移动hr
中的未分片集合时,用户或应用程序对该集合发出写操作。 写入操作会在原始主分片中创建collection。管理员稍后发出
movePrimary
来恢复hr
数据库的原始主分片。movePrimary
由于交错写入操作留下的命名空间冲突而失败。
目标分片必须重建索引
作为movePrimary
操作的一部分,目标分片必须在成为主分片后对迁移的collection重建索引。这可能需要大量时间,具体取决于每个collection的索引数量和要索引的数据量。
有关索引构建过程的更多信息,请参阅在已填充collection上构建索引。
移动具有变更流的集合
从 MongoDB 8.0 开始,movePrimary
不会将具有变更流的集合作废。将集合移到新的分片之后,变更流可以继续从集合中读取事件。
在早期MongoDB版本中, movePrimary
会使集合变更流无效,并且变更流无法从集合中读取事件。
在所有MongoDB版本中, movePrimary
会更新移动的未分片集合的 UUID 。
更多信息
有关完整过程,请参阅从分片集群中删除分片。