Docs 主页 → 开发应用程序 → MongoDB Manual
movePrimary
movePrimary
在分片集群中,
movePrimary
会重新分配用于保存数据库中所有未分片集合的主分片。movePrimary
首先更改集群元数据中的主分片,然后将所有未分片集合迁移到指定的分片。使用以下形式的命令:db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } ) 例如,以下命令将主分片从
test
移动到shard0001
:db.adminCommand( { movePrimary : "test", to : "shard0001" } ) 当命令返回时,数据库的主分片位置已切换到指定的分片。 要完全停用分片,请使用
removeShard
命令。movePrimary
是管理命令,仅适用于mongos
实例。警告
启动
movePrimary
后,在该命令完成之前,请勿对该数据库中的任何未分片集合执行任何读取或写入操作。迁移期间对这些集合发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。
考虑因素
mongos
对 使用"majority"
movePrimary
写关注。
在维护窗口期间发出movePrimary
movePrimary
可能需要很长时间才能完成,具体取决于数据库的大小以及网络运行状况或计算机资源等因素。 迁移期间对数据库发出的读取或写入操作可能会导致意外行为,包括迁移操作可能失败或数据丢失。
请考虑安排一个维护窗口,在此期间应用程序会停止对集群的所有读取和写入。在计划内停机期间发出movePrimary
可以降低由于交叉读取或写入数据库中的未分片集合而导致出现未定义行为的风险。
使用movePrimary
移动未分片集合
对于 MongoDB4 。2 和之前的版本中,如果在包含未 分片 集合的数据库上使用movePrimary
命令,则必须执行以下额外步骤。
注意
在移动包含未分片集合的数据库时,MongoDB 4.4 不需要执行这些额外步骤。
对于 MongoDB 4.2,必须:
在向移动后的任何未分片集合读取或写入任何数据之前,对所有
mongos
实例和所有mongod
分片节点(包括从节点)使用flushRouterConfig
命令。
对于 MongoDB 4.0 及更早版本,必须:
重启所有
mongos
实例;在向任何已移动的未分片集合读取或写入任何数据之前,请对所有
mongos
实例使用flushRouterConfig
命令。
这些步骤确保所有集群节点刷新其元数据缓存,其中包括主分片的位置。否则,您可能会在读取时丢失数据,并且可能无法将数据写入正确的分片。要恢复,您必须手动干预。
命名空间冲突阻止迁移
movePrimary
如果目标分片包含有冲突的collection命名空间,则会失败。例如:
管理员发出
movePrimary
来更改hr
数据库的主分片。当
movePrimary
移动hr
中的未分片集合时,用户或应用程序对该集合发出写操作。 写入操作会在原始主分片中创建collection。管理员稍后发出
movePrimary
来恢复hr
数据库的原始主分片。movePrimary
由于交错写入操作留下的命名空间冲突而失败。
目标分片必须重建索引
作为movePrimary
操作的一部分,目标分片必须在成为主分片后对迁移的collection重建索引。这可能需要大量时间,具体取决于每个collection的索引数量和要索引的数据量。
有关索引构建过程的更多信息,请参阅在已填充collection上构建索引。
更多信息
有关完整过程,请参阅从现有分片集群中删除分片。