MongoDB 4.0兼容性更新说明

本文介绍MongoDB 4.0版本的兼容性变化。

如需查看MongoDB官网兼容性更新说明文档,请前往MongoDB官网下载

移除对MONGODB-CR的支持

4.0版本开始,MongoDB将不再支持已弃用的MongoDB身份验证机制(MONGODB-CR)。

3.0版本起,MongoDB不支持创建MONGODB-CR用户,除非部署是从2.6或更早版本升级而来,且原有MONGODB-CR用户未升级认证模式。

若您的部署仍使用MONGODB-CR模式存储用户凭证,在升级到4.0前必须升级至SCRAM(Salted Challenge Response Authentication Mechanism)。

移除authSchemaUpgrade命令

MongoDB 4.0移除了authSchemaUpgrade命令。该命令在3.03.6版本中用于将MONGODB-CR用户升级为SCRAM用户

从 db.copyDatabase() 和 copydb 中移除 MONGODB-CR 支持

db.copyDatabase()方法无法从强制使用MONGODB-CR认证的mongod实例复制数据。

copydb命令同样受限。此变更后,MongoDB 4.0移除了copydbgetnonce命令。

弃用MMAPv1

4.0版本起,MongoDB弃用MMAPv1存储引擎。若需迁移至WiredTiger存储引擎。

x.509 认证证书限制

4.0版本开始,若在使用x.509认证时指定--sslAllowInvalidCertificatesnet.ssl.allowInvalidCertificates: true(MongoDB 4.2起别名改为--tlsAllowInvalidateCertificatesnet.tls.allowInvalidCertificates: true),无效证书仅能建立TLS/SSL连接,不足以完成认证。

您可以更新为有效证书(如通过可信CA签名),或使用net.ssl.CAFile指定自定义CA来解决问题。

副本集

移除副本集协议版本 pv0

4.0版本移除了已弃用的副本集协议版本0(pv0)。升级前需先升级至pv1,升级操作示例如下:

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

建议同时调高settings.catchUpTimeoutMillis以减少在w:1writeConcern配置下发生回滚的概率。

移除主从复制

4.0版本不再支持主从复制。若仍在使用此模式,必须转换为副本集。

日志与副本集

4.0版本起,使用WiredTiger存储引擎的副本集成员不可禁用日志(即禁用--nojournalstorage.journal.enabled: false)。

索引构建和副本集

在使用--replSetreplication.replSetName配置副本集时,您不能指定--noIndexBuildRetrystorage.indexBuildRetry参数。也就是说,对于作为副本集成员的mongod实例,无法使用--noIndexBuildRetrystorage.indexBuildRetry

回滚限制

4.0版本取消回滚数据量上限(原限制为300MB),并引入可配置参数rollbackTimeLimitSecs(默认1天,4.0之前的版本固定为30分钟)。

分片集群

mongos在以下影响分片集群元数据的操作中使用"majority"Write Concern。

命令

方法

说明

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。这些功能包括:

  • SCRAM-SHA-256

  • 新的类型转换运算符(如$toBool$toInt等)和增强功能

  • 多文档事务

  • $dateToString选项更改

  • 新的变更流方法

  • 更改流恢复令牌数据类型更改

其他变更

  • 分片集群现支持地理空间查询运算符$near和 $nearSphere

  • 对于create命令以及mongo shelldb.createCollection()方法,在local数据库以外的数据库中创建集合时,不能将选项autoIndexId设置为false

  • 启用身份验证后,在没有listDatabases操作权限的情况下运行listDatabases命令,系统将返回运行该命令的用户具有find操作权限的所有数据库的列表。在之前的版本中,在没有listDatabases操作权限的情况下运行命令会返回Unauthorized

  • taskExecutorPoolSize的默认值从0更改为1。在Linux上,若要还原4.0部署的先前行为,请将taskExecutorPoolSize设置为0 ,将AsyncRequestsSenderUseBaton设置为false

  • MongoDB 4.0删除了将mongodmongos实例的transportLayer以及net.transportLayer设置为legacy的功能。transportLayer设置默认为asio,且无法修改。

  • MongoDB 4.0开始,reIndex命令及其db.collection.reIndex()将采用全局独占锁,并将阻止其他操作,直到完成。

  • 如果为yearisoYeartimezone以外的字段指定的值超出有效范围,则$dateFromParts将从其他日期部分中减去差值以计算日期。在以前的版本中,超出范围的值会导致错误。

  • 修改了killCursors权限操作的行为。在MongoDB 4.0之前,如果用户知道进程的ID,他们可以杀死任何进程。从MongoDB 4.0起,killCursors允许用户杀死与当前身份验证的用户关联的任何进程。如果用户没有终止进程的权限,killCursors将返回错误。

  • MongoDB 4.0添加了一个killAnyCursor权限操作,该操作授予用户终止指定集合的任何游标的权限。

  • MongoDB 4.0版本开始,当mongos可执行文件尝试连接到功能兼容性版本(fCV)高于自身版本的mongod实例时,该mongos进程将会崩溃。例如,MongoDB 4.0版本的mongos无法连接到将fCV设置为4.24.2分片集群。不过,若该4.2分片集群的fCV仍保持在4.0,则MongoDB 4.0版本的mongos可以正常连接。

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

cursor.min()和cursor.max()

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

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

禁用TLS 1.0

MongoDB 二进制文件(mongod、mongos 和 mongo)在支持TLS 1.1+ 的系统上会默认禁用TLS 1.0加密支持。

若需强制启用TLS 1.0支持:

  • mongod 实例:在配置文件中设置 net.ssl.disabledProtocols: none,或通过命令行参数 --sslDisabledProtocols none 实现。

  • mongos 实例:配置方式与 mongod 相同,使用 net.ssl.disabledProtocols: none 或 --sslDisabledProtocols none

  • mongo Shell:需添加 --sslDisabledProtocols none 参数。

    --sslDisabledProtocols 参数可以在以下mongo Shell版本中使用:

    • MongoDB 4.0+

    • MongoDB 3.6.5+

    • MongoDB 3.4.15+

macOS 系统中,若使用 3.6.4 或更早版本的 mongo Shell 连接 MongoDB 4.0+ 集群,必须显式启用 TLS 1.0。

mongo Shell

show collections

mongo Shell中,show collections等同于:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 对于具备权限的用户:显示数据库内所有非系统集合的列表。

  • 对于无权限的用户:仅显示其拥有访问权限的集合。

4.0版本的mongo Shell连接到4.0之前版本且不支持 authorizedCollections 和 nameOnly 参数的MongoDB时:

  • 用户必须拥有 listCollection 权限才能执行命令。

  • 无权限用户执行时,MongoDB 通过 connectionStatus 返回的 authenticatedUserPrivileges 字段生成近似结果。

db.getCollectionNames()

mongo Shell中,db.getCollectionNames()等同于:

db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
  • 对于具有访问权限的用户,该方法会列出数据库中所有集合的命令。

  • 对于不具有访问权限的用户,该方法仅会列出执行该命令的用户拥有权限的集合。

删除了二进制和已弃用的字段/命令

mongoperf

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

copydbclone命令

MongoDB 4.0不再支持copydbclone命令,以及mongo Shell的帮助函数db.copyDatabase()db.cloneDatabase()

作为替代方案,您可以使用mongodumpmongorestore(需配合mongorestore选项的--nsFrom--nsTo参数使用)或使用驱动程序编写脚本。

例如,将test 数据库复制到同实例的 examples 数据库,您可以:

  1. 用于mongodumptest数据库转储到归档文件mongodump-test-db

    mongodump --archive="mongodump-test-db" --db=test
  2. 使用mongorestore搭配--nsFrom--nsTo参数从存档中恢复。

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

您可以按需添加参数,例如 --uri--host--username 等。

您也可以不使用存档文件,通过 mongodumptest数据库连接到标准输出流,并通过管道传递到mongorestore

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

参数

删除已弃用的logUserIds参数。

$isolated运算符

MongoDB不再支持$isolated运算符。如果您有包含$isolated运算符的索引或视图,请在升级之前重新创建没有该运算符的索引或视图。

geoNear命令

MongoDB弃用了geoNear命令,请改用以下命令:

  • $geoNear 聚合阶段

  • $near 查询操作符

  • $nearSphere 查询操作符

maxScan选项

MongoDB弃用了maxScanmongo Shellcursor.maxScan(),请改用maxTimeMSmongo Shellcursor.maxTimeMS()

输出字段变更

  • replSetGetStatus返回结果中的以下字段已弃用:

    • replSetGetStatus.syncingTo

    • replSetGetStatus.members[n].syncingTo

    请改用replSetGetStatus.replSetGetStatus.syncSourceHost和 replSetGetStatus.members[n].syncSourceHost

  • $currentOp聚合阶段、currentOp 命令以及 db.currentOp() 帮助函数在其输出结果中将不再返回threadId 字段。

  • serverStatus 的 asserts.warning 字段固定返回 0