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开始,如果指定--tlsAllowInvalidateCertificates或net.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。
索引构建和复制集
不能使用--replSet或 replication.replSetName指定--noIndexBuildRetry或storage.indexBuildRetry。也就是说,不能对属于副本集的mongod实例使用--noIndexBuildRetry或storage.indexBuildRetry。
回滚限制
MongoDB 4.0取消了可以回滚的数据量限制。在之前的版本中,mongod实例不会回滚超过300兆字节的数据,如果需要回滚超过300兆字节的数据,则需要手动干预。
从MongoDB 4.0开始,回滚时间限制默认为1天,可以使用新参数rollbackTimeLimitSecs配置。在早期版本中,回滚时间限制不可配置,设置为30分钟。
分片集群
mongos对影响分片集群元数据的以下操作使用"majority"写入关注:
4.0功能兼容性
4.0中的一些功能不仅需要4.0二进制文件,还需要将featureCompatibilityVersion设置为4.0。这些功能包括:
一般的
- 地理空间查询运算符
$near和$nearSphere现在支持对分片集合进行查询。 - 对于
create命令(和mongo shelldb.createCollection()方法),在本地数据库以外的数据库中创建集合时,不能将选项autoIndexId设置为false。 - 启用身份验证后,在没有
listDatabases操作特权的情况下运行listDatabases命令将返回运行该命令的用户具有find操作权限的所有数据库的列表。在之前的版本中,在没有listDatabases操作的情况下运行命令会导致Unauthorized响应。 taskExecutorPoolSize的默认值从0更改为1。在Linux上,要恢复4.0部署的先前行为,settaskExecutorPoolSize为0和AsyncRequestsSenderUseBatonfalse。- MongoDB 4.0删除了将mongod和mongoss实例的transportLayer和net.transportLayer设置为legacy的功能。transportLayer设置自动设置为asio,且无法修改。
- 从MongoDB 4.0开始,
reIndex命令及其helperdbdb.collection.reIndex()采用Global exclusive (W) lock,并将阻止其他操作,直到完成。 - 如果为
year、isoYear和timezone以外的字段指定的值超出有效范围,$dateFromParts携带或减去其他日期部分的差额来计算日期。在之前的版本中,超过范围的值会导致错误。 - 改变了
killCursors特权操作的行为。在MongoDB 4.0之前,如果用户知道该光标的ID,他们可以杀死任何光标。从MongoDB 4.0起,killCursors特权允许用户杀死与当前身份验证的用户关联的任何光标。如果用户没有终止光标的权限,killCursors将返回错误。 - MongoDB 4.0添加了
killAnyCursor特权操作,授予用户为指定集合终止任何光标的权限。 当试图连接到功能兼容性版本(fCV)大于
mongos的mongod实例时,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二进制文件(mongod、mongos和mongo)在提供TLS 1.1+的系统上禁用对TLS 1.0加密的支持。
如果您需要支持TLS 1.0:
对于
mongod实例,您可以指定nonetonetnet.ssl.disabledProtocols或--sslDisabledProtocols none。对于
mongos实例,您可以指定nonetonetnet.ssl.disabledProtocols或--sslDisabledProtocols none。对于mongo shell,您可以指定
--sslDisabledProtocols none。-sslDisabledProtocols选项可用于mongo shell,位于:- MongoDB 4.0+版本
- MongoDB 3.6.5版本+
- MongoDB版本3.4.15+
在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连接到不支持authorizedCollections和nameOnly选项的早期版本MongoDB部署时,
- 用户必须拥有运行
listCollections所需的访问权限。 - 如果用户没有所需的访问权限并运行
show collections,MongoDB使用connectionStatus返回的authenticatedUserPrivileges字段为用户返回大致的集合列表。
db.getCollectionNames()
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
- 对于具有所需访问权限(在数据库上授予
listCollections操作的特权)的用户,该方法列出了数据库所有集合的名称。 - 对于没有所需访问权限的用户,该方法仅列出用户拥有特权的集合。例如,如果用户在数据库中的特定集合上
find,该方法将仅返回该集合。
删除了二进制和不建议使用的字段/命令
mongoperf
MongoDB 4.0删除了mongoperf二进制文件。
copydb和clone命令
MongoDB 4.0不建议使用copydb和無性系命令和他们的蒙古贝壳帮手db.copy数据库()和db.cloneDatabase()。
作为替代方案,用户可以使用mongodump和mongorestore(带有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命令。改为使用以下操作之一。
$geoNear聚合阶段。$near查询操作员。$nearSphere查询操作员。
maxScan选项
MongoDB不赞成find命令的选项maxScan和mongo shell助手游标.maxScan()。而是使用maxTimeMS选项或帮助器cursor.maxTimeMS()。
输出字段更改
不建议使用从
replSetGetStatus返回的以下字段:改用
replSetGetStatus.syncSourceHost和replSetGetStatus.members[n\].syncSourceHost$currentOp聚合阶段、currentOp命令和db.currentOp()助手不再在其输出中返回threadId字段。serverStatus命令现在总是为asserts.warning字段返回0。