Docs 主页 → 开发应用程序 → MongoDB Manual
降级4 。 4 将副本集设置为4 。 2
在尝试任何降级之前,请先熟悉本文档的内容。
降级路径
重要
升级或降级副本集之前,请确保所有副本集节点都正在运行。否则,升级或降级操作将在所有节点启动后才会完成。
如果需要从 4.4 降级,请降级到最新的 4.2 补丁版本。
MongoDB 仅支持单版本降级。您无法降级到比当前版本落后多个版本的版本。
例如,您可以将4 442降级。将 系列转换为 。 - 系列部署。但是,进一步降级该 。部署到 的 系列。不支持4 240系列部署。
警告
降级下限
如果需要从版本 4.4 降级,请降级到 4.2.6 或更高版本。 您无法降级到 4.2.5 或更早的版本。
创建备份
可选但建议使用。创建数据库备份。
访问控制
如果副本集启用了访问控制,则降级用户权限必须包括跨数据库列出和托管索引的权限。具有 root
角色的用户拥有所需的权限。
先决条件
要从 4.2 降级到 4.0,您必须删除保留的不兼容功能和/或更新不兼容的配置设置。
1. 命名空间长度
从 MongoDB 4.4 开始:
未分片collection和视图的命名空间长度限制为255字节,分片collection的命名空间长度限制为235字节。对于collection或视图,命名空间包括数据库名称、点 ( .
) 分隔符和collection/视图名称(例如<database>.<collection>
)。
在降级之前,请解析命名空间超过特征兼容性版本 (FCV) 4.2 的 120 字节命名空间长度限制的任何collection或视图。
要确定是否有任何collection或视图的命名空间超过 120 字节限制,请将mongo
shell 连接到主节点并运行:
db.adminCommand("listDatabases").databases.forEach(function(d){ let mdb = db.getSiblingDB(d.name); mdb.getCollectionInfos( ).forEach(function(c){ namespace = d.name + "." + c.name namespacelenBytes = encodeURIComponent(namespace).length if (namespacelenBytes > 120) { print (c.type.toUpperCase() + " namespace exceeds 120 bytes:: " + namespace ) } } ) })
如果任何collection或视图命名空间超过 120 字节,则在降级 FCV之前执行 :
使用
renameCollection
命令重命名collection。对于视图,使用
db.createView()
以更短的名称重新创建视图,然后删除原始视图。
2. 降级特征兼容性版本 (fCV)
提示
确保没有正在进行任何初始同步。在初始同步过程中运行
setFeatureCompatibilityVersion
命令将导致重新启动初始同步。确保没有副本集成员处于
ROLLBACK
或RECOVERING
状态。降级到featureCompatibilityVersion (fCV) : "4.2" 隐式执行
replSetReconfig
以从配置文档中删除term
字段,并阻塞,直到新配置传播到大多数副本集节点。
要降级副本集的featureCompatibilityVersion
,请执行以下操作:
将
mongo
Shell 连接到主节点。将
featureCompatibilityVersion
降级为"4.2"
。db.adminCommand({setFeatureCompatibilityVersion: "4.2"}) setFeatureCompatibilityVersion
命令对内部系统collection执行写入,并且是幂等的。如果由于任何原因未成功完成该命令,请在主节点上重试该命令。为确保副本集的所有节点都反映更新后的
featureCompatibilityVersion
,请连接到每个副本集节点并检查featureCompatibilityVersion
:db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) 所有成员均应返回包含以下内容的结果:
"featureCompatibilityVersion" : { "version" : "4.2" } 如果任何成员返回
"4.4"
的featureCompatibilityVersion
,请等待该成员反映"4.2"
版本,然后再继续。
有关返回的featureCompatibilityVersion
值的详细信息,请参阅获取 FeatureCompatibilityVersion。
注意
仲裁节点不会复制 admin.system.version
集合。因此,无论副本集的 fCV 值如何,仲裁节点始终具有等于二进制文件的降级版本的特征兼容性版本。
例如,MongoDB 4.4 集群中的仲裁节点的 fCV 值为 4.2。
3. 删除 fCV 4.4 保留功能
仅当 fCV 设置为 "4.4"
时,才需要执行以下步骤。
删除所有与 4.2 不兼容的保留 4.4功能。 其中包括:
- 复合哈希索引
删除所有复合哈希索引。
使用
db.collection.getIndexes()
识别集合中的任何复合哈希索引,并使用db.collection.dropIndex()
删除这些索引。
4. 删除 4.4 功能
删除所有使用 4.4 功能的保留功能。 这些包括但不限于:
如果有任何视图定义包含 4.4 操作符,例如
$unionWith
或$function
。 另请参阅新聚合操作符。
步骤
警告
在继续执行降级过程之前,请确保所有副本集节点(包括延迟的副本集节点)都反映先决条件更改。 也就是说,在降级之前检查每个节点的featureCompatibilityVersion
并删除不兼容的功能。
降级副本集的从节点。
降级副本集的每个从节点,一次一个:
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
等待成员恢复到
SECONDARY
状态,然后再降级下一个从节点。 要检查成员的状态,请使用mongo
shell 中的rs.status()
方法。一旦成员处于
SECONDARY
阶段,就降级下一个从节点。
将仲裁节点副本集节点降级(如果有)。
如果副本集不包含仲裁节点,请跳过此步骤。
降级副本集的仲裁节点:
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 删除仲裁节点数据目录的内容。
storage.dbPath
配置设置或--dbpath
命令行选项指定仲裁节点mongod
的数据目录。rm -rf /path/to/mongodb/datafiles/* 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
等待成员恢复到
ARBITER
状态。 要检查成员的状态,请将mongo
Shell 连接到成员并运行rs.status()
方法。
从主节点降级。
在mongo
shell 中使用rs.stepDown()
降级主节点并强制执行正常的故障转移过程。
rs.stepDown()
rs.stepDown()
加快故障转移过程,优于直接关闭主节点。
替换并重新启动以前的主mongod
。
当rs.status()
显示主节点已降级并且另一节点已采用PRIMARY
状态时:
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将
mongod
二进制文件替换为 4.2 二进制文件,然后重新启动。