将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

  1. 将mongo shell连接到 mongod实例。

  2. 降级featureCompatibilityVersion"4.0"

    db.adminCommand({setFeatureCompatibilityVersion: "4.0"})
    

    setFeatureCompatibilityVersion命令执行对内部系统集合的写入,并且是幂等的。如果由于任何原因命令未能成功完成,请在mongod实例上重试该命令。

2.删除FCV 4.2持久功能

只有当fCV被设置为"4.2"时,以下步骤才是必要的。

删除所有与4.0不兼容的持久4.2功能。这些包括:

2a。索引键大小img

从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

您可以通过以下方式修改视图:

您可以通过以下方式修改colleciton验证表达式:

3.更新tls前缀配置

从MongoDB 4.2开始,MongoDB添加了“tls”前缀选项作为“ssl”前缀选项的别名。

如果您的部署或客户端使用“tls”前缀选项,请替换为mongod、mongos以及mongo shell和驱动程序的相应“ssl”前缀选项。

4.准备从zstd压缩降级

zstd数据压缩

zstd压缩库从4.2版本开始可用。

如果您的独立设备有任何使用zstd压缩的数据:

提示:

在完成所有其他先决条件步骤后,执行此步骤。

  1. 停止对实例的所有写入。

  2. 创建一个mongodump在开始降级之前,您的数据库;mongodump输出未压缩的数据。

    mongodump --host=<myhost> --port=<port> --out=mystandalone.uncompressed.fcv4.0
    

    如果您的独立执行访问控制,请包含任何其他选项,例如--username--password--authenticationDatabase

  3. mongod实例创建一个新的空data directory。此目录将在下面的降级过程中使用。

    重要:

    确保运行mongod的用户帐户具有新目录的读写权限。

  4. 如果您使用配置文件,请更新该文件以为降级过程做好准备:

zstd日志压缩

从4.2版本开始,zstd压缩库可用于日志数据压缩。

如果mongod实例使用zstd库作为其日志压缩机:

笔记:

如果您在降级过程中遇到mongod的不干净关机,因此您需要使用日志文件进行恢复,请使用4.2 mongod恢复实例,然后重试实例的降级。

zstd网络压缩

从4.2版本开始,zstd压缩库可用于网络消息压缩。

为准备降级:

  1. 对于使用zstd进行网络消息压缩并使用配置文件mongod实例,请更新net.compression.compressors设置,为降级过程中的重新启动做准备。

    如果您改用命令行选项,则必须更新以下规程中的选项。

  2. 对于在其URI connection string中指定zstd的任何客户端,请更新以从列表中删除zstd

  3. 对于任何在其--networkMessageCompressors中指定zstd的mongo shell,更新以从列表中删除zstd。

重要:

当双方启用网络压缩时,消息会被压缩。否则,双方之间的消息将被解压缩。

5.删除客户端字段级加密文档验证关键字

重要:

在降级服务器之前,删除应用程序中的客户端字段级加密代码。

MongoDB 4.2增加了对执行客户端字段级加密的支持,作为集合的指定JSON模式验证文档验证的一部分。具体来说,$jsonSchema对象支持encryptencryptMetadata关键字。MongoDB 4.0支持这些关键字,如果任何集合将这些关键字指定为其验证$jsonSchema的一部分,则无法启动

在每个数据库上使用db.getCollectionInfos()来识别指定自动字段级加密规则的集合,作为$jsonSchema验证器的一部分。要准备降级,请使用4.0不兼容的关键字对每个集合执行以下操作之一:

程序

警告:

在继续进行降级程序之前,请确保已完成先决条件。

1、下载最新的4.0二进制文件

使用软件包管理器或手动下载,获取4.0系列的最新版本。如果使用软件包管理器,请为4.0二进制文件添加一个新存储库,然后执行实际的降级过程。

重要:

在升级或降级副本集之前,请确保所有副本集成员都在运行。如果您不这样做,在开始所有成员之前,升级或降级将不会完成。

如果您需要从4.2降级,请降级到4.0的最新补丁版本。

2、使用最新的4.0 mongod实例重新启动

  1. 关闭你的mongod副本。要安全地终止mongod进程,您可以将mongo shell连接到实例并运行:

    db.adminCommand( { shutdown: 1 } )
    

    有关安全终止mongod实例的其他方法,请参见Stop mongod Processes.

  2. 将4.2二进制文件替换为下载的4.0mongod二进制文件,然后重新启动。

    笔记:

    如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

    3、如果从zstd压缩切换,请恢复数据。

    如果您尚未从使用zstd压缩的独立降级,请跳过此步骤。

    如果您已从使用zstd的独立版降级,则已将数据转储为先决条件。使用mongorestore将该数据恢复到您的4.0独立数据。

    mongorestore --host=<myhost> --port=<port>  mystandalone.uncompressed.fcv4.0
    

原文 - Downgrade 4.2 Standalone to 4.0

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""