本文介绍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.0至3.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认证时指定--sslAllowInvalidCertificates或net.ssl.allowInvalidCertificates: true(MongoDB 4.2起别名改为--tlsAllowInvalidateCertificates或net.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:1的writeConcern配置下发生回滚的概率。
移除主从复制
4.0版本不再支持主从复制。若仍在使用此模式,必须转换为副本集。
日志与副本集
4.0版本起,使用WiredTiger存储引擎的副本集成员不可禁用日志(即禁用--nojournal或storage.journal.enabled: false)。
索引构建和副本集
在使用--replSet或replication.replSetName配置副本集时,您不能指定--noIndexBuildRetry或storage.indexBuildRetry参数。也就是说,对于作为副本集成员的mongod实例,无法使用--noIndexBuildRetry或storage.indexBuildRetry。
回滚限制
4.0版本取消回滚数据量上限(原限制为300MB),并引入可配置参数rollbackTimeLimitSecs(默认1天,4.0之前的版本固定为30分钟)。
分片集群
mongos在以下影响分片集群元数据的操作中使用"majority"Write Concern。
命令 | 方法 | 说明 |
|
| |
|
| |
|
| |
|
| 在MongoDB 3.6中更改。 |
|
| |
| ||
|
| |
|
| |
| ||
|
4.0功能兼容性
4.0版本中的一些功能不仅需要4.0的二进制文件,还需要将featureCompatibilityVersion设置为4.0。这些功能包括:
SCRAM-SHA-256
新的类型转换运算符(如
$toBool、$toInt等)和增强功能多文档事务
$dateToString选项更改新的变更流方法
更改流恢复令牌数据类型更改
其他变更
分片集群现支持地理空间查询运算符
$near和$nearSphere。对于
create命令以及mongo shell的db.createCollection()方法,在local数据库以外的数据库中创建集合时,不能将选项autoIndexId设置为false。启用身份验证后,在没有
listDatabases操作权限的情况下运行listDatabases命令,系统将返回运行该命令的用户具有find操作权限的所有数据库的列表。在之前的版本中,在没有listDatabases操作权限的情况下运行命令会返回Unauthorized。将
taskExecutorPoolSize的默认值从0更改为1。在Linux上,若要还原4.0部署的先前行为,请将taskExecutorPoolSize设置为0,将AsyncRequestsSenderUseBaton设置为false。MongoDB 4.0删除了将mongod和mongos实例的
transportLayer以及net.transportLayer设置为legacy的功能。transportLayer设置默认为asio,且无法修改。从MongoDB 4.0开始,
reIndex命令及其db.collection.reIndex()将采用全局独占锁,并将阻止其他操作,直到完成。如果为
year、isoYear和timezone以外的字段指定的值超出有效范围,则$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.2的4.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二进制文件。
copydb和clone命令
MongoDB 4.0不再支持copydb和clone命令,以及mongo Shell的帮助函数db.copyDatabase()和db.cloneDatabase()。
作为替代方案,您可以使用mongodump和mongorestore(需配合mongorestore选项的--nsFrom和--nsTo参数使用)或使用驱动程序编写脚本。
例如,将test 数据库复制到同实例的 examples 数据库,您可以:
用于
mongodump将test数据库转储到归档文件mongodump-test-db。mongodump --archive="mongodump-test-db" --db=test使用
mongorestore搭配--nsFrom和--nsTo参数从存档中恢复。mongorestore --archive="mongodump-test-db" --nsFrom='test.*' --nsTo='examples.*'
您可以按需添加参数,例如 --uri、--host、--username 等。
您也可以不使用存档文件,通过 mongodump将test数据库连接到标准输出流,并通过管道传递到mongorestore。
mongodump --archive --db=test | mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'参数
删除已弃用的logUserIds参数。
$isolated运算符
MongoDB不再支持$isolated运算符。如果您有包含$isolated运算符的索引或视图,请在升级之前重新创建没有该运算符的索引或视图。
geoNear命令
MongoDB弃用了geoNear命令,请改用以下命令:
$geoNear聚合阶段$near查询操作符$nearSphere查询操作符
maxScan选项
MongoDB弃用了maxScan和mongo Shell的cursor.maxScan(),请改用maxTimeMS或mongo Shell的cursor.maxTimeMS()。
输出字段变更
replSetGetStatus返回结果中的以下字段已弃用:replSetGetStatus.syncingToreplSetGetStatus.members[n].syncingTo
请改用
replSetGetStatus.replSetGetStatus.syncSourceHost和replSetGetStatus.members[n].syncSourceHost。$currentOp聚合阶段、currentOp命令以及db.currentOp()帮助函数在其输出结果中将不再返回threadId字段。serverStatus的asserts.warning字段固定返回0。