将4.2独立降级到4.0
降级路径
在尝试降级之前,请熟悉本文档的内容。
重要:
在升级或降级副本集之前,请确保所有副本集成员都在运行。如果您不这样做,在开始所有成员之前,升级或降级将不会完成。
如果您需要从4.2降级,请降级到4.0的最新补丁版本。
提示:
如果您降级,
- 在Windows上,降级到4.0.12或更高版本。您无法降级到4.0.11或更低版本。
- 在Linux/macOS上,如果您正在运行更改流,并希望无缝恢复更改流,请降级到4.0.7或更高版本。
创建备份
可选但推荐。创建数据库的备份。
访问控制
如果您的部署启用了访问控制,则降级用户特权必须包括跨数据库列出和管理索引的特权。具有root
角色的用户具有所需的特权。
先决条件
要从4.2降级到4.0,您必须删除持久存在的不兼容功能和/或更新不兼容的配置设置。这些包括:
1.降级功能兼容性版本(fCV)
要降级独立featureCompatibilityVersion
:
将mongo shell连接到
mongod
实例。降级
featureCompatibilityVersion
为"4.0"
db.adminCommand({setFeatureCompatibilityVersion: "4.0"})
setFeatureCompatibilityVersion
命令执行对内部系统集合的写入,并且是幂等的。如果由于任何原因命令未能成功完成,请在mongod
实例上重试该命令。
2.删除FCV 4.2持久功能
只有当fCV被设置为"4.2"
时,以下步骤才是必要的。
删除所有与4.0不兼容的持久4.2功能。这些包括:
2a。索引键大小
从MongoDB 4.2开始,对于设置为"4.2"
或更高的featureCompatibilityVersion
(fCV),MongoDB删除了索引密钥限制。对于设置为"4.0"
fCV,该限制仍然适用。
如果fCV设置为“4.0”后,索引的键超过了索引键限制,请考虑将索引更改为散列索引或索引计算值。您还可以在解决问题之前暂时将 failIndexKeyTooLong
设置为false。但是,如果将 failIndexKeyTooLong
设置为false,则使用这些索引的查询可能返回不完整的结果。
2b。索引名称长度
从MongoDB 4.2开始,对于设置为"4.2"
或更高的featureCompatibilityVersion
(fCV),MongoDB删除了索引名称长度。对于设置为"4.0"
的fCV,该限制仍然适用。
如果您的索引名称在fCV设置为"4.0"
后超过索引名称长度,请删除并使用较短的名称重新创建索引。
db.collection.dropIndex( <name | index specification> )
db.collection.createIndex(
{ <index specification> },
{ name: <shorter name> }
}
参见:
2c。独特的索引版本
对于featureCompatibilityVersion
(fCV)“4.2”
,MongoDB为唯一索引使用一种新的内部格式,该格式与MongoDB 4. 0不兼容。新的内部格式既适用于现有的唯一索引,也适用于新建/重建的唯一索引。
如果fCV曾设置为"4.2"
请使用以下脚本删除并重新创建所有唯一索引。
提示:
脚本
// A script to rebuild unique indexes after downgrading fcv 4.2 to 4.0.
// Run this script to drop and recreate unique indexes
// for backwards compatibility with 4.0.
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos( { type: "collection" } ).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
if (idx.unique){
print("Dropping and recreating the following index:" + tojson(idx))
assert.commandWorked(mdb.runCommand({dropIndexes: c.name, index: idx.name}));
let res = mdb.runCommand({ createIndexes: c.name, indexes: [idx] });
if (res.ok !== 1)
assert.commandWorked(res);
}
});
});
});
2d。删除user_1_db_1
系统唯一索引
此外,如果您启用了访问控制,您还必须删除admin.system.users
集合上的systemunique索引user_1_db_1
。
如果fCV曾设置为"4.2"
请使用以下命令删除user_1_db_1
系统唯一索引:
db.getSiblingDB("admin").getCollection("system.users").dropIndex("user_1_db_1")
在以下过程中使用4.0二进制文件启动服务器时,user_1_db_1
索引将自动重建。
2e。删除通配符索引
对于设置为"4.2"``featureCompatibilityVersion
(fCV),MongoDB支持创建通配符索引。在降级到fCV"4.0"
之前,您必须删除所有通配符索引。
使用以下脚本删除并重新创建所有通配符索引:
// A script to drop wildcard indexes before downgrading fcv 4.2 to 4.0.
// Run this script to drop wildcard indexes
// for backwards compatibility with 4.0.
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
var key = Object.keys(idx.key);
if (key[0].includes("$**")) {
print("Dropping index: " + idx.name + " from " + idx.ns);
let res = mdb.runCommand({dropIndexes: currentCollection, index: idx.name});
assert.commandWorked(res);
}
});
});
});
重要:
在进行中的通配符索引构建期间降级到fCV
"4.0"
不会自动删除或终止索引构建。索引构建可以在降级到fcv"4.0"
后完成,从而在集合上生成有效的通配符索引。针对该数据目录启动4.0二进制文件将导致启动失败。使用
db.currentOp()
检查是否有任何正在进行的通配符索引构建。一旦任何正在进行的通配符索引构建完成,请运行脚本将其删除,然后再降级到fCV"4.0"
2f。查看包含4.2个运算符的定义/集合验证定义
在降级二进制文件之前,请修改包含4.2运算符的只读视图定义和集合验证定义,例如$set
、$unset
、$replaceWith
。
- 对于
$set
阶段,请使用$addFields
阶段。 - 对于
$replaceWith
阶段,请使用$replaceRoot
阶段。 - 对于
$unset
阶段,请使用$project
阶段。
您可以通过以下方式修改视图:
- 删除视图(
db.myview.drop()
方法)并重新创建视图(db.createView()
方法)或 - 使用
collMod
命令。
您可以通过以下方式修改colleciton验证表达式:
- 使用
collMod
命令。
3.更新tls
前缀配置
从MongoDB 4.2开始,MongoDB添加了“tls”前缀选项作为“ssl”前缀选项的别名。
如果您的部署或客户端使用“tls”前缀选项,请替换为mongod、mongos以及mongo shell和驱动程序的相应“ssl”前缀选项。
4.准备从zstd
压缩降级
zstd
数据压缩
zstd压缩库从4.2版本开始可用。
如果您的独立设备有任何使用zstd压缩的数据:
提示:
在完成所有其他先决条件步骤后,执行此步骤。
停止对实例的所有写入。
创建一个
mongodump
在开始降级之前,您的数据库;mongodump
输出未压缩的数据。mongodump --host=<myhost> --port=<port> --out=mystandalone.uncompressed.fcv4.0
如果您的独立执行访问控制,请包含任何其他选项,例如
--username
、--password
和--authenticationDatabase
。为
mongod
实例创建一个新的空data directory
。此目录将在下面的降级过程中使用。重要:
确保运行
mongod
的用户帐户具有新目录的读写权限。如果您使用配置文件,请更新该文件以为降级过程做好准备:
Deletestorage
storage.wiredTiger.collectionConfig.blockCompressor
使用默认压缩器(snappy
)或设置为另一个支持4.0的压缩机。将
storage.dbPath
到新的数据目录。如果您改用命令行选项,则必须更新以下规程中的选项。
zstd
日志压缩
从4.2版本开始,zstd压缩库可用于日志数据压缩。
- 如果使用配置文件,删除
storage.wiredTiger.engineConfig.journalCompressor
使用默认压缩器(snappy
)或设置为另一个支持4.0的压缩机。 - 如果改用命令行选项,则必须更新以下规程中的选项。
笔记:
如果您在降级过程中遇到
mongod
的不干净关机,因此您需要使用日志文件进行恢复,请使用4.2mongod
恢复实例,然后重试实例的降级。
zstd
网络压缩
从4.2版本开始,zstd压缩库可用于网络消息压缩。
为准备降级:
对于使用zstd进行网络消息压缩并使用配置文件的
mongod
实例,请更新net.compression.compressors
设置,为降级过程中的重新启动做准备。如果您改用命令行选项,则必须更新以下规程中的选项。
对于在其
URI connection string
中指定zstd
的任何客户端,请更新以从列表中删除zstd
。对于任何在其--networkMessageCompressors中指定zstd的mongo shell,更新以从列表中删除zstd。
重要:
当双方启用网络压缩时,消息会被压缩。否则,双方之间的消息将被解压缩。
5.删除客户端字段级加密文档验证关键字
重要:
在降级服务器之前,删除应用程序中的客户端字段级加密代码。
MongoDB 4.2增加了对执行客户端字段级加密的支持,作为集合的指定JSON模式验证文档验证的一部分。具体来说,$jsonSchema
对象支持encrypt
和encryptMetadata
关键字。MongoDB 4.0不支持这些关键字,如果任何集合将这些关键字指定为其验证$jsonSchema
的一部分,则无法启动。
在每个数据库上使用db.getCollectionInfos()
来识别指定自动字段级加密规则的集合,作为$jsonSchema
验证器的一部分。要准备降级,请使用4.0不兼容的关键字对每个集合执行以下操作之一:
使用
collMod
修改集合的validator
,并将$jsonSchema
替换为仅包含4.0兼容的文档验证语法:db.runCommand({ "collMod" : "<collection>", "validator" : { "$jsonSchema" : { <4.0-compatible schema object> } } })
-或-
-
db.runComand({ "collMod" : "<collection>", "validator" : {} })
程序
警告:
在继续进行降级程序之前,请确保已完成先决条件。
1、下载最新的4.0二进制文件
使用软件包管理器或手动下载,获取4.0系列的最新版本。如果使用软件包管理器,请为4.0二进制文件添加一个新存储库,然后执行实际的降级过程。
重要:
在升级或降级副本集之前,请确保所有副本集成员都在运行。如果您不这样做,在开始所有成员之前,升级或降级将不会完成。
如果您需要从4.2降级,请降级到4.0的最新补丁版本。
2、使用最新的4.0 mongod
实例重新启动
关闭你的mongod副本。要安全地终止mongod进程,您可以将mongo shell连接到实例并运行:
db.adminCommand( { shutdown: 1 } )
有关安全终止mongod实例的其他方法,请参见Stop
mongod
Processes.。将4.2二进制文件替换为下载的4.0
mongod
二进制文件,然后重新启动。笔记:
如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。
- 如果您的命令行选项包含“tls”前缀选项,请更新为“ssl”前缀选项。
- 如果
mongod
实例使用zstd
数据压缩,- 将
--dbpath
更新到新目录(在先决条件期间创建)。 - Remove
--wiredTigerCollectionBlockCompressor
使用默认的snappy
压缩机(或者显式设置为4.0支持的压缩机)。
- 将
- 如果
mongod
实例使用zstd
日志压缩,- 删除
--wiredTigerJournalCompressor
以使用默认的snappy
压缩机(或者,显式设置为4.0支持的压缩机)。
- 删除
- 如果
mongod
实例包含zstd
网络消息压缩,- 删除
--networkMessageCompressors
,使用默认的snappy,zlib
压缩器启用消息压缩。或者,明确指定压缩机。
- 删除
3、如果从
zstd
压缩切换,请恢复数据。如果您尚未从使用zstd压缩的独立降级,请跳过此步骤。
如果您已从使用zstd的独立版降级,则已将数据转储为先决条件。使用
mongorestore
将该数据恢复到您的4.0独立数据。mongorestore --host=<myhost> --port=<port> mystandalone.uncompressed.fcv4.0