本文介紹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。