MongoDB 4.0中的兼容性变化

以下4.0更改可能会影响与旧版本MongoDB的兼容性。

移除对MONGODB-CR

从4.0版本开始,MongoDB取消了对已弃用的MongoDB挑战响应(MONGODB-CR)身份验证机制的支持。

自3.0版本以来,MongoDB不支持创建MONGODB-CR用户,除非部署已从2.6或更早的部署升级,该部署已经拥有MONGODB-CR用户,并且没有升级身份验证模式。

如果您的部署在MONGODB-CR模式中存储了用户凭据,则在升级到4.0版本之前,您必须升级到咸挑战响应身份验证机制(SCRAM)。有关升级到SCRAM的信息,请参阅升级到SCRAM。

删除authSchemaUpgrade命令

MongoDB 4.0删除了authSchemaUpgrade命令。该命令在MongoDB 3.0到MongoDB 3.6中可用,支持将MONGODB-CR用户系统升级为SCRAM用户的过程。

如果您的部署在MONGODB-CR模式中存储了用户凭据,则在升级到4.0版本之前,您必须升级到咸挑战响应身份验证机制(SCRAM)。有关升级到SCRAM的信息,请参阅升级到SCRAM。

db.copyDatabase()中删除MONGODB-CR支持copydb

方法db.copyDatabase()无法从强制执行MONGODB-CR身份验证的mongod实例复制。

copydb命令无法从强制MONGODB-CR身份验证的mongod实例复制。结合此更改,MongoDB 4.0删除了copydbgetnonce命令。

不建议使用MMAPv1

从4.0版本开始,MongoDB不建议使用MMAPv1存储引擎。

要将您的MMAPv1存储引擎部署更改为WiredTiger存储引擎,请参阅:

x.509 认证证书限制

从MongoDB 4.2开始,如果指定--tlsAllowInvalidateCertificatesnet.tls.allowInvalidCertificates:true在使用x.509身份验证时,无效证书仅足以建立TLS连接,但不足以进行身份验证。

如果您使用无效证书执行x.509身份验证,请将证书更新为有效证书。例如,您可以使用受信任的CA对现有证书进行签名,或者如果使用自定义CA,请使用net.ssl.CAFile指定CA

副本集

删除复制集的pv0

从4.0版本开始,MongoDB删除了已弃用的副本集协议版本0 pv0

在升级到MongoDB 4.0之前,您必须升级到pv1

要升级到pv1,请将mongo shell连接到副本集主副本,并执行以下操作序列:

cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);

为了减少w:1回滚的可能性,您还可以将副本集重新配置为更高的settings.catchUpTimeoutMillis设置。

有关pv1的更多信息,请参阅Replica Set协议版本。

删除主从复制

MongoDB 4.0取消了对已弃用的主从复制的支持。在升级到MongoDB 4.0之前,如果您的部署使用主从复制,则必须升级到副本集。

要从主从复制转换为副本集,请参阅

日志和复制集

从MongoDB 4.0开始,对于使用WiredTiger存储引擎的复制集成员,您无法指定--nojournal选项或storage.journal.enabled: false

索引构建和复制集

不能使用--replSetreplication.replSetName指定--noIndexBuildRetry或storage.indexBuildRetry。也就是说,不能对属于副本集的mongod实例使用--noIndexBuildRetry或storage.indexBuildRetry

回滚限制

MongoDB 4.0取消了可以回滚的数据量限制。在之前的版本中,mongod实例不会回滚超过300兆字节的数据,如果需要回滚超过300兆字节的数据,则需要手动干预。

从MongoDB 4.0开始,回滚时间限制默认为1天,可以使用新参数rollbackTimeLimitSecs配置。在早期版本中,回滚时间限制不可配置,设置为30分钟。

分片集群

mongos对影响分片集群元数据的以下操作使用"majority"写入关注:

命令 方法 笔记
addShard sh.addShard()
create db.createCollection()
drop db.collection.drop()
dropDatabase db.dropDatabase() 在MongoDB 3.6中更改
enableSharding sh.enableSharding()
movePrimary
renameCollection db.collection.renameCollection()
shardCollection sh.shardCollection()
removeShard
setFeatureCompatibilityVersion

4.0功能兼容性

4.0中的一些功能不仅需要4.0二进制文件,还需要将featureCompatibilityVersion设置为4.0。这些功能包括:

一般的

  • 地理空间查询运算符$near$nearSphere现在支持对分片集合进行查询。
  • 对于 create命令(和mongo shell db.createCollection()方法),在本地数据库以外的数据库中创建集合时,不能将选项autoIndexId设置为false。
  • 启用身份验证后,在没有listDatabases操作特权的情况下运行listDatabases命令将返回运行该命令的用户具有find操作权限的所有数据库的列表。在之前的版本中,在没有listDatabases操作的情况下运行命令会导致Unauthorized响应。
  • taskExecutorPoolSize的默认值从0更改为1。在Linux上,要恢复4.0部署的先前行为,settaskExecutorPoolSize为0AsyncRequestsSenderUseBatonfalse
  • MongoDB 4.0删除了将mongodmongoss实例的transportLayer和net.transportLayer设置为legacy的功能。transportLayer设置自动设置为asio,且无法修改。
  • 从MongoDB 4.0开始,reIndex命令及其helperdbdb.collection.reIndex()采用Global exclusive (W) lock,并将阻止其他操作,直到完成。
  • 如果为yearisoYeartimezone以外的字段指定的值超出有效范围,$dateFromParts携带或减去其他日期部分的差额来计算日期。在之前的版本中,超过范围的值会导致错误。
  • 改变了killCursors特权操作的行为。在MongoDB 4.0之前,如果用户知道该光标的ID,他们可以杀死任何光标。从MongoDB 4.0起,killCursors特权允许用户杀死与当前身份验证的用户关联的任何光标。如果用户没有终止光标的权限,killCursors将返回错误。
  • MongoDB 4.0添加了killAnyCursor特权操作,授予用户为指定集合终止任何光标的权限。
  • 当试图连接到功能兼容性版本(fCV)大于mongosmongod实例时,mongos二进制文件将崩溃。例如,您无法将MongoDB 4.0版本mongos连接到fCV设置为4.2的4.2分片集群。但是,您可以将MongoDB 4.0版本的mongos连接到fCV设置为4.0的4.2分片集群。

  • 从4.0开始,MongoDB按配置解析localhostIP地址,而不是假设127.0.0.1

cursor.min()cursor.max()

如果您使用max()min()来指定范围,则max()指定的边界必须大于min()指定的绑定

在之前的版本中,边界可以相等,但不会扫描索引条目,总是导致一个空的结果集。

禁用TLS 1.0

MongoDB二进制文件(mongodmongosmongo)在提供TLS 1.1+的系统上禁用对TLS 1.0加密的支持。

如果您需要支持TLS 1.0:

在macOS上,要将mongo shell 3.6.4或更早版本连接到MongoDB 4.0+部署,需要显式启用TLS 1.0。

AES-GCM

Windows上的MongoDB Enterprise不再支持AES256-GCM。此密码现在仅在Linux上可用。

mongoshell

show collections

在mongo shell中,show collections等价于:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 对于具有所需访问权限的用户,show collections列出了数据库的非系统集合。
  • 对于没有所需访问权限的用户,show collections仅列出用户拥有特权的集合。

当4.0版本的mongo shell连接到不支持authorizedCollectionsnameOnly选项的早期版本MongoDB部署时,

db.getCollectionNames()

db.getCollectionNames()等价于:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 对于具有所需访问权限(在数据库上授予listCollections操作的特权)的用户,该方法列出了数据库所有集合的名称。
  • 对于没有所需访问权限的用户,该方法仅列出用户拥有特权的集合。例如,如果用户在数据库中的特定集合上find,该方法将仅返回该集合。

删除了二进制和不建议使用的字段/命令

mongoperf

MongoDB 4.0删除了mongoperf二进制文件。

copydbclone命令

MongoDB 4.0不建议使用copydb無性系命令和他们的蒙古贝壳帮手db.copy数据库()db.cloneDatabase()。

作为替代方案,用户可以使用mongodumpmongorestore(带有themorestore选项--nsFrom--nsTo)或使用驱动程序编写脚本。

例如,要将test数据库从在默认端口27017上运行的本地实例复制到同一实例上的examples数据库,您可以:

  • 使用mongodump将测试数据库转储到归档文件mongodump-test-db:

    mongodump --archive="mongodump-test-db" --db=test
    
  • 使用mongorestore--nsFrom--nsTo从存档中恢复(通过数据库名称更改):

    mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
    

提示:

必要时包括其他选项,例如指定uri或主机、用户名、密码和身份验证数据库。

或者,您可以mongodumptest数据库到标准输出流和管道进入mongorestore

mongodump --archive --db=test | mongorestore --archive  --nsFrom='test.*' --nsTo='examples.*'

参数:

  • MongoDB删除了过时的logUserIds参数。改为使用审计

$isolated运算符号

MongoDB放弃了对$isolated运算符的支持。如果您有一个包含$isolated运算符的现有部分索引或包含$isolated运算符的视图,请在升级之前在定义中重新创建没有运算符的索引或视图。

代替$isolated运算符,而是使用事务

geoNear指挥权

MongoDB 4.0不建议使用geoNear命令。改为使用以下操作之一。

maxScan选项

MongoDB不赞成find命令的选项maxScan和mongo shell助手游标.maxScan()。而是使用maxTimeMS选项或帮助器cursor.maxTimeMS()

输出字段更改

原文 - Compatibility Changes in MongoDB 4.0

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

results matching ""

    No results matching ""