翻译或纠错本页面

降级 MongoDB 3.4 到 3.2

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

降级路径

一旦升级到3.4,您就不能降级到 3.2.7 或者之前的版本。您只可以降级到 3.2.8 或者之后的版本。

创建备份

可选,但是推荐。 创建您数据库的备份。

删除 3.4 不兼容的功能

如果需要降级,您必须删除所有与 3.2 或者之前版本 3.4 features incompatible ,如下面列出的功能所示。仅在 featureCompatibilityVersion 被设置为 "3.4" 的情况下。这些步骤是必要的。

对于针对单机、复制集或者分片集群的指令,请查阅:

1. Downgrade Feature Compatibility Version

featureCompatibilityVersion 降级到 "3.2"

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

这个命令必须执行写操作到内部系统集合。如果由于任何原因该命令没有成功完整执行,由于该操作是幂等的,您可以安全地在 target 上重试该命令。

2. Remove Views

如果您之前定义过任何视图,在将MongoDB 3.4 降级到 3.2 之前删除视图。

为了查找视图,您可以在 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 集合,以删除该数据库中的所有视图。

3. Remove Collation Option from Collections and Indexes

如果您之前已经定义过集合或索引的任何非 “简单” collation,在将MongoDB 3.4 降级到 3.2 之前删除集合或索引。

为了查找collation 规范的集合,您可以在 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]);
   });
});

您可以将集合的内容迁移到一个没有collation规范的新集合(一个方式是通过聚合管道阶段 $out )。

为了查找collation 规范的索引,您可以在 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);
         }
      });
   });
});

删除collation规范的索引。在降级之后,重新创建删除的索引。

4. Convert Data of Type Decimal

转化所有 decimal 类型的数据。在MongoDB 3.4 版本之前,在包含 decimal 类型上的文档操作有可能会失败。您可以查阅 货币数据建模 了解一些可能的转化选项。

为了检查十进制的存在,您可以在可能包含十进制数据的集合上运行 db.collection.validate(true)

只有在 featureCompatibilityVersion"3.2" 的时候, db.collection.validate(true) 才会报告十进制数据。

5. Downgrade Index Versions

如果您有 v: 2 索引(例如,如果 featureCompatibilityVersion: "3.4" , MongoDB 3.4 中创建的索引默认版本), 在降级MongoDB之前, reindex the collection 重新创建集合中的所有索引为 v: 1

为了查找 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);
         }
      });
   });
});