MongoDB 4.0中的兼容性变更
MongoDB 4.0的兼容性变动翻译。
原文由MongoDB文档团队提供,许可证为CC BY-NC-SA 3.0。
在MongoDB 4.0中,兼容性发生了变化。
以下4.0版本的更改可能会影响与之前版本的MongoDB的兼容性。
删除MONGODB-CR
在4.0版本中,我们已经移除了先前被不推荐使用的MongoDB挑战-响应(MONGODB-CR)认证机制。
从3.0版本开始,除非从2.6版本升级,否则不再支持使用MONGODB-CR进行用户的新建。
在您的环境中,如果用户的凭据存储在MONGODB-CR模式中,则在升级到4.0版本之前,必须升级为Salted Challenge Response Authentication Mechanism(SCRAM)。有关升级到SCRAM的信息,请参阅SCRAM升级。
删除 authSchemaUpgrade 命令
在MongoDB 4.0中,已删除了authSchemaUpgrade命令。此命令在MongoDB 3.0至3.6版本中存在,用于支持将MONGODB-CR用户升级为SCRAM用户的过程。
在您的环境中,如果用户的凭证信息存储在MONGODB-CR模式中,则在升级到4.0版本之前,需要升级到Salted Challenge Response Authentication Mechanism(SCRAM)。有关升级到SCRAM的信息,请参考SCRAM的升级。
删除MONGODB-CR在db.copyDatabase()和copydb的使用
db.copyDatabase()方法无法从强制使用MONGODB-CR的mongod实例中复制。
只需要一个选项。
copydb命令无法从强制使用MONGODB-CR的mongod实例复制。此外,随着这个更改,MongoDB 4.0中已经删除了copydbgetnonce命令。
MMAPv1 已不被推荐。
从版本4.0开始,MMAPv1存储引擎已被弃用。
如果要将MMAPv1存储引擎的环境更改为WiredTiger存储引擎,请参考以下内容。
-
- Change Standalone to WiredTiger
-
- Change Replica Set to WiredTiger
- Change Sharded Cluster to WiredTiger
限制x.509认证证书
如果在4.0及以后版本中使用了x.509认证,并指定了–sslAllowInvalidCertificates或ssl.allowInvalidCertificates: true参数,则无效的证书可以建立TLS/SSL连接,但无法进行认证。
当使用无效证书时,请更新为有效证书,例如,对现有证书进行受信任CA的签名,或者使用自定义CA并在net.ssl.CAFile中指定该CA等。
复制品套装
在复制套装中,废除pv0
在4.0版本中,已经废弃了非推荐使用的复制集的协议版本0 pv0。
在升级到MongoDB 4.0之前,需要先升级到pv1。
请使用Mongo Shell连接到副本集的主节点,然后按照以下步骤进行升级到pv1。
cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);
为了减少指定了w:1的情况下可能发生的回滚,您还可以在复制集中对setting.catchUpTimeoutMillis的设置进行大幅重新调整。
有关pv1的详细信息,请参考副本集协议版本。
废除主从复制
在MongoDB 4.0中,已经废弃了原先就已经不推荐使用的主从复制。在升级到MongoDB 4.0之前,如果您的环境正在使用主从复制,必须升级为副本集。
请参考将主从部署转换为副本集。
写真撮影と複製セット
在MongoDB 4.0及更高版本中,无法为使用WiredTiger存储引擎的副本集成员指定–nojournal选项或storage.journal.enabled: false。
建立索引和复制集
不能同时指定–noIndexBuildRetry和storage.indexBuildRetry,以及–replSet和replication.replSetName。也就是说,在副本集中的mongod实例上不能使用–noIndexBuildRetry或storage.indexBuildRetry。
关于回滚的限制
在MongoDB 4.0中,关于可能需要回滚的数据量的限制被消除了。在之前的版本中,一个mongod实例不会回滚超过300兆字节的数据,如果超过了300兆字节并需要回滚,则需要手动操作。
分片集群
在涉及以下 Shard 集群的元数据的操作中,mongos 将使用”majority”。
4.0 特性兼容性
需要将一些功能设置为4.0二进制文件,并设置featureCompatibilityVersion为4.0。适用于以下功能。
-
- SCRAM-SHA-256
-
- New type conversion operators and enhancements
-
- Multi-document transactions
-
- $dateToString option changes
- New change stream methods
一般的变更点
-
- 地理情報クエリオペレーターの$nearと$nearSphereは、シャード化されたコレクションに対して問合せすることができるようになりました。
-
- createコマンド(およびmongoシェルでのdb.createCollection()メソッド)では、localデータベース以外のデータベース中にコレクションを作成するとき、autoIndexIdオプションをfalseに設定することはできません。
-
- 認証が有効になっている場合、listDatabasesコマンドをlistDatabases権限を持っていない状態で実行すると、ユーザーがコマンドを実行していてfind権限を持っているすべてのデータベースの一覧を返します。以前のバージョンでは、listDatabases権限が無い状態でコマンドを実行すると、Unauthorizedレスポンスが返されていました。
-
- taskExecutorPoolSizeパラメータのデフォルト値が、0から1に変更されました。Linuxでは、以前の動作に戻すためには、taskExecutorPoolSizeを0にして、さらにAsyncRequestsSenderUseBatonをfalseに設定してください。
-
- MongoDB 4.0ではmongodとmongosインスタンスに対してtransportLayerとnet.transportLayerをlegacyにセットする機能は削除されました。transportLayerは自動的にasioに設定され、変更はできません。
-
- MongoDB 4.0以降では、reIndexコマンドとそのヘルパーであるdb.collection.reIndex()メソッドはGlobal exclusive (W) lockを取得し、処理が完了するまで他のオペレーションをブロックします。
-
- year、isoYear、timezone以外のフィールドの値が有効な範囲を超えている場合、$dateFromPartsは、日付を計算するために、差分を他の部分に繰り上げたり繰り下げたりして反映します。以前のバージョンでは、有効な範囲を超えた値はエラーになっていました。
-
- 特権操作であるkillCursorsの動作が変更されました。以前のバージョンでは、ユーザーは対象のカーソルのIDを知っていれば、どんなカーソルでもkillすることができました。MongoDB 4.0では、killCursors権限により、現在認証されているユーザーに紐づくあらゆるカーソルをkillする権限が認められます。ユーザーがカーソルをkillする権限を持っていない場合、killCursorsはエラーを返します。
-
- MongoDB 4.0では、特定のコレクションのあらゆるカーソルをkillできるkillAnyCursor権限が追加されました。
- MongoDB 4.0以降では、mongosは、mongodバイナリのバージョンがmongosバイナリのバージョンより大きく、かつ、mongodのfeature compatibility versionがmongosのfeature compatibility versionより大きい場合、mongodインスタンスに接続しようとするとクラッシュします。
cursor的最小值和最大值。
当使用max()方法和min()方法一起指定范围时,max()方法指定的边界必须比min()方法指定的边界大。
在以前的版本中,两个边界可以相同,但是它不会搜索索引条目,始终返回空结果集。
禁用TLS 1.0
在支持TLS 1.1及更高版本的MongoDB二进制文件(mongod、mongos、mongo)中,已禁用了对TLS 1.0的支持。
请确保支持TLS 1.0版本。
-
- mongodインスタンスについては、net.ssl.disabledProtocolsにnoneを指定するか、–sslDisabledProtocolsにnoneを指定してください。
-
- mongosインスタンスについては、net.ssl.disabledProtocolsにnoneを指定するか、–sslDisabledProtocolsにnoneを指定してください。
mongoシェルについては、–sslDisabledProtocolsにnoneを指定してください。mongoシェルに対する–sslDisabledProtocolsオプションは、以下のバージョンで有効です。
MongoDB version 4.0+
MongoDB version 3.6.5+
MongoDB version 3.4.15+
在macOS上,如果要将mongo shell版本3.6.4或更早版本连接到MongoDB 4.0及以上版本,则必须显式启用TLS 1.0。
AES-GCM可以进行重复性加密标记,这是一种安全且高效的加密模式。
在Windows系统中,MongoDB Enterprise不再支持AES256-GCM加密算法。
MongoDB 命令行界面 (mongo shell)
显示集合
在MongoDB 4.0及更高版本的mongo shell中,show collections命令与以下命令相同。
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true} )
-
- 必要なアクセス権限を持っているユーザーには、show collectionsはそのデータベースの非システムコレクションの一覧を返します。
- 必要なアクセス権限を持っていないユーザーには、show collectionsはそのユーザーが権限を持っているコレクションの一覧のみを返します。
当连接到MongoDB的早于4.0版本的mongo shell时,它不支持authorizedCollections和nameOnly选项。
-
- ユーザーはlistCollectionを実行するために必要な権限を持っている必要があります。
- 必要な権限を持っていないユーザーがshow collectionsを実行した場合、MongoDBはconnectionStatusにより返されるauthenticatedUserPrivilegesフィールドを使って、おおまかなコレクションの一覧を返します。
获取数据库中的集合名称。
在Mongo Shell 4.0及更高版本中,db.getCollectionNames()与以下命令相同。
db.runCommand( { listCollections: 1.0, authorizedCollections: true, nameOnly: true } )
-
- 必要なアクセス権限(データベースに対してlistCollectionsアクションを認める権限)を持っているユーザーには、データベース中のすべてのコレクションの一覧を返します。
- 必要なアクセス権限を持っていないユーザーには、ユーザーが権限を持っているコレクションの一覧のみを返します。たとえば、データベースの中であるコレクションに対するfind権限を持っている場合、そのコレクションのみが返されます。
二进制字段/指令已被删除并被弃用
性能监测
MongoDB 4.0版本已删除了mongoperf二进制文件。
复制数据库和克隆命令
在MongoDB 4.0版本中,copydb和clone命令以及它们在mongo shell中的辅助方法db.copyDatabase()和db.cloneDatabase()已被弃用。
作为替代方法,以下途径可行。
mongodumpとmongorestoreを使うか、ドライバを使ってスクリプトを作成します。
如果仅需要一个选项,请将以下内容用中文重新表达:参数
- 古いlogUserIdsパラメータが削除されました。代わりに監査機能を利用してください。
уisolated_operator
MongoDB已经删除了对$isolated操作符的支持。如果存在包含$isolated操作符的部分索引或视图,请从索引或视图的定义中移除该操作符,并在升级之前重新创建它。
请使用事务替代孤立运算符。
地理附近命令
在MongoDB 4.0中,geoNear命令已被弃用,请使用以下任一操作代替。
-
- $geoNear aggregationステージ
-
- $near クエリオペレータ
- $nearSphere クエリオペレータ
最大扫描选项
请使用maxTimeMS选项或cursor.maxTimeMS()来代替,因为find命令的maxScan选项以及mongo shell的helper cursor.maxScan()已经不推荐使用了。
调整输出字段
replSetGetStatusから返される以下のフィールドは非推奨となりました。
replSetGetStatus.syncingTo
replSetGetStatus.members[n].syncingTo
请使用replSetGetStatus.replSetGetStatus.syncSourceHost和replSetGetStatus.members[n].syncSourceHost进行替代。
-
- $currentOpaggregationステージ、currentOpコマンド、db.currentOp()ヘルパーの出力から、threadIdフィールドが削除されました。
- serverStatusコマンドの出力のasserts.warningフィールドは、常に0となりました。