将 3.4 独立降级到 3.2

在本页面

在尝试任何降级之前,请熟悉本文档的内容。

Downgrade Path

一旦升级到 3.4,就不能降级到 3.2.7 或更早的版本。您只能降级到 3.2.8 或更高版本。

Create Backup

*可选,但推荐.*创建数据库备份。

Prerequisites

在降级二进制文件之前,您必须降级功能部件兼容性版本,并删除所有具有 3.2 或更早版本的3 .4 功能不兼容,如下所述。仅当将featureCompatibilityVersion设置为"3.4"时,才需要执行这些步骤。

1.降级功能兼容版本

  • mongoShell 连接到mongod实例。

  • featureCompatibilityVersion降级为"3.2"

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

此命令必须执行对内部系统集合的写入。如果由于某种原因该命令未成功完成,则可以安全地在mongod实例上重试该命令,因为该操作是幂等的。

2.删除视图

如果定义了任何视图,请先删除视图,然后再将 MongoDB 3.4 降级到 3.2.

  • mongoShell 连接到mongod实例。

  • 要查找视图,可以在mongo shell 中运行以下命令:

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos({type: "view"}).forEach(function(c){
      print(mdb[c.name]);
   });
});

在每个包含视图的数据库中,删除system.views集合以删除该数据库中的所有视图。

如果使用访问控制运行,则必须具有删除数据库的system.views集合的特权。参见创建一个角色以删除 system.views 跨数据库的集合

3.从集合和索引中删除排序规则选项

如果您为集合或索引定义了任何非“简单”排序规则,请在将 MongoDB 3.4 降级到 3.2 之前删除该集合或索引。

  • mongoShell 连接到mongod实例。

  • 要查找具有排序规则规范的集合,可以在mongo shell 中运行以下命令:

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos( { "options.collation": { $exists: true } } ).forEach(function(c){
      print(mdb[c.name]);
   });
});

您可以在没有排序规则规范的情况下将集合的内容迁移到新集合(一种方法是通过聚合管道阶段$out)。

  • 要查找具有排序规则规范的索引,可以在mongo shell 中运行以下命令:
db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos().forEach(function(c){
      let currentCollection = mdb.getCollection(c.name);
      currentCollection.getIndexes().forEach(function(i){
         if (i.collation){
            printjson(i);
         }
      });
   });
});

使用整理规范删除索引。降级后,重新创建删除的索引。

4.转换十进制类型的数据

  • mongoShell 连接到mongod实例。

  • 转换decimal类型的任何数据。在低于 3.4 的 MongoDB 版本中,对包含decimal类型的文档的操作可能会失败。有关某些可能的转换选项,请参见模型货币数据

要检测十进制的存在,可以对可能包含十进制数据的集合运行db.collection.validate(true)

db.collection.validate(true)仅在featureCompatibilityVersion"3.2"时才报告十进制数据。

5.降级索引版本

如果您具有v: 2个索引(即featureCompatibilityVersion: "3.4",则是在 MongoDB 3.4 中创建的索引的默认版本),请在降级 MongoDB 之前使用重新索引集合将集合上的所有索引重新创建为v: 1

  • mongoShell 连接到mongod实例。

  • 要使用v: 2查找索引,可以在mongo shell 中运行以下命令:

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos().forEach(function(c){
      let currentCollection = mdb.getCollection(c.name);
      currentCollection.getIndexes().forEach(function(i){
         if (i.v === 2){
            printjson(i);
         }
      });
   });
});

Procedure

下载最新的 3.2 二进制文件。

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

一旦升级到 3.4,就不能降级到 3.2.7 或更早的版本。您只能降级到 3.2.8 或更高版本。

使用最新的 3.2 mongod 实例重新启动。

关闭您的mongod实例。用下载的mongod二进制文件替换现有的二进制文件,然后重新启动。