Mongodb?刪除集合數(shù)據(jù)后釋放磁盤空間的操作步驟
刪除集合
在Mongodb當集合數(shù)據(jù)占用比較多,對其進行清理后,集合存儲空間下降,但磁盤空間并沒釋放,對于具有活動更新的集合來說,有一些可重用的空間是正常的。過多的可重用空間通常是刪除大量數(shù)據(jù)的結(jié)果。
如果您有許多大量集合需要壓縮(或者想要盡可能的釋放磁盤空間),請重新同步副本集的次要成員
如果compact最終沒有釋放足夠的空間, 通過初始同步將通過復制另一個成員的數(shù)據(jù)來重建所有數(shù)據(jù)文件。
compact 如果您確實決定在生產(chǎn)環(huán)境中運行,可以考慮將通過以下方式最大限度地減少影響:
- 副本集部署(理想情況下至少三個數(shù)據(jù)承載成員,沒有仲裁者)
- compact 一次在一臺輔助設(shè)備上運行操作。
- 配置 secondary 為 hidden 在操作期間,競爭流量將是基本復制。
- 重新分配主節(jié)點。
- 壓縮舊的主數(shù)據(jù)庫。
集合數(shù)據(jù)如下:
local_rs1:PRIMARY> db.version() 4.4.15 # Primary local_rs1:PRIMARY> db.myCompact.count() 500000 local_rs1:PRIMARY> db.runCommand( { collStats: "myCompact" } ).totalSize 20520960 # 11747328 + 8773632 = 20520960 root@ubuntu-x64_01:/data/mongodb/data/test# ls -tl | grep 3518756157035530607 -rw------- 1 mongodb mongodb 11747328 11月 17 10:53 collection-8--3518756157035530607.wt -rw------- 1 mongodb mongodb 8773632 11月 17 10:53 index-9--3518756157035530607.wt # ------------------------------------- # SECONDARY 1 local_rs1:SECONDARY> db.myCompact.count() 500000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 20492288 # 11661312 + 8830976 = 20492288 root@ubuntu-x64_01:/data/mongodb27018/data/test# ls -lt | grep 7679634562768091767 -rw------- 1 mongodb mongodb 11661312 11月 17 10:53 collection-8-7679634562768091767.wt -rw------- 1 mongodb mongodb 8830976 11月 17 10:53 index-9-7679634562768091767.wt # ------------------------------------- # SECONDARY 2 local_rs1:SECONDARY> db.myCompact.count() 500000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 20533248 # 11702272 + 8830976 = 20533248 root@ubuntu-x64_01:/data/mongodb27019/data/test# ls -lt | grep 265063963681791421 -rw------- 1 mongodb mongodb 11702272 11月 17 10:53 collection-8-265063963681791421.wt -rw------- 1 mongodb mongodb 8830976 11月 17 10:53 index-9-265063963681791421.wt
刪除集合所有數(shù)據(jù),執(zhí)行 db.collection.deleteMany() 方法。 Compact 操作阻塞行為是特定于版本的。
版本 | 阻止行為 |
---|---|
4.4 之前 | compact 阻止所有讀寫活動。 |
4.4 | compact 阻止這些操作: db.collection.drop() db.collection.createIndex() db.collection.createIndexes() db.collection.dropIndex() db.collection.dropIndexes() collMod 所有其他操作都是允許的。 |
4.4.17后 | compact 阻止這些操作: db.collection.drop() db.collection.createIndex() db.collection.createIndexes() db.collection.dropIndex() db.collection.dropIndexes() collMod 所有其他操作都是允許的。 鎖定順序發(fā)生變化。 |
compact 嘗試減少集合中數(shù)據(jù)和索引所需的存儲空間,向操作系統(tǒng)釋放不需要的磁盤空間。此操作的有效性取決于工作負載,并且無法恢復任何磁盤空間。如果您已從集合中刪除大量數(shù)據(jù)并且不打算替換它,則此命令非常有用。
測試刪除 60% (300000/500000)集合數(shù)據(jù),如下:
# PRIMARY local_rs1:PRIMARY> db.myCompact.find().limit(2) { "_id" : ObjectId("6556d1a2ff3d41b00910281b"), "uid" : 0, "username" : "compact0", "create_at" : ISODate("2023-11-17T02:36:18.883Z") } { "_id" : ObjectId("6556d1a2ff3d41b00910281c"), "uid" : 1, "username" : "compact1", "create_at" : ISODate("2023-11-17T02:36:18.894Z") } local_rs1:PRIMARY> db.myCompact.deleteMany({ "uid" : { $lt: 300000 } }) { "acknowledged" : true, "deletedCount" : 300000 } local_rs1:PRIMARY> db.myCompact.count() 200000
以上清理數(shù)據(jù)后,磁盤空間和集合存儲大小并沒有減小。 如下
# PRIMARY local_rs1:PRIMARY> db.myCompact.count() 200000 local_rs1:PRIMARY> db.runCommand( { collStats: "myCompact" } ).totalSize 28233728 root@ubuntu-x64_01:/data/mongodb/data/test# ls -tl | grep 3518756157035530607 -rw------- 1 mongodb mongodb 15519744 11月 17 11:47 collection-8--3518756157035530607.wt -rw------- 1 mongodb mongodb 12713984 11月 17 11:47 index-9--3518756157035530607.wt # ---------------------------- # SECONDARY 1 local_rs1:SECONDARY> db.myCompact.count() 200000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 30523392 root@ubuntu-x64_01:/data/mongodb27018/data/test# ls -lt | grep 7679634562768091767 -rw------- 1 mongodb mongodb 16674816 11月 17 13:09 collection-8-7679634562768091767.wt -rw------- 1 mongodb mongodb 13848576 11月 17 13:09 index-9-7679634562768091767.wt # ---------------------------- # SECONDARY 2 local_rs1:SECONDARY> db.myCompact.count() 200000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 20516864 root@ubuntu-x64_01:/data/mongodb27019/data/test# ls -tl | grep 265063963681791421 -rw------- 1 mongodb mongodb 11702272 11月 17 13:14 collection-8-265063963681791421.wt -rw------- 1 mongodb mongodb 8814592 11月 17 13:14 index-9-265063963681791421.wt
Compact 集合
對于副本集, 您可以在存儲副本集中的集合和索引上使用 compact ,但是有一些重要的注意事項:
主節(jié)點不會將compact命令復制到輔助節(jié)點。
您應該盡可能在輔助節(jié)點上運行compact。如果您無法在輔助節(jié)點上運行compact,請使用 force 選項。
從 MongoDB 4.4.17 開始:
compact 運行時輔助節(jié)點可以進行復制。
允許讀取。
壓縮輔助節(jié)點。compact 在輔助節(jié)點之一上運行。完成后 compact ,依次在剩余的每個輔助節(jié)點上重復該操作。
# SECONDARY 1 local_rs1:SECONDARY> db.myCompact.count() 200000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 30523392 # 釋放空間 23064576 = 22 MB 左右 local_rs1:SECONDARY> db.runCommand( { compact: "myCompact" } ) { "bytesFreed" : 23064576, "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1700198786, 1), "signature" : { "hash" : BinData(0,"o2RnaYFH8J1pgLaIx2T+iLCkPdY="), "keyId" : NumberLong("7236938018798436354") } }, "operationTime" : Timestamp(1700198786, 1) } local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 7458816 # 4382720 + 3076096 = 7458816 root@ubuntu-x64_01:/data/mongodb27018/data/test# ls -lt | grep 7679634562768091767 -rw------- 1 mongodb mongodb 4382720 11月 17 13:26 collection-8-7679634562768091767.wt -rw------- 1 mongodb mongodb 3076096 11月 17 13:26 index-9-7679634562768091767.wt
重新分配主節(jié)點。要讓當前的初選下臺并觸發(fā)選舉,請使用該 rs.stepDown()方法。要提名特定輔助節(jié)點,請調(diào)整成員優(yōu)先級。
local_rs1:PRIMARY> rs.status() { "set" : "local_rs1", "date" : ISODate("2023-11-17T05:41:07.931Z"), ........ "members" : [ { "_id" : 1, "name" : "192.168.88.11:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ...... }, { "_id" : 3, "name" : "192.168.88.11:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", ...... }, { "_id" : 4, "name" : "192.168.88.11:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ...... } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1700199666, 1), "signature" : { "hash" : BinData(0,"a5utef8Cjsp20W8DWtvzsmMn9Wo="), "keyId" : NumberLong("7236938018798436354") } }, "operationTime" : Timestamp(1700199666, 1) } local_rs1:PRIMARY> rs.stepDown() { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1700199726, 1), "signature" : { "hash" : BinData(0,"qpsh46gaM9GKg8RMV799tA/o8uw="), "keyId" : NumberLong("7236938018798436354") } }, "operationTime" : Timestamp(1700199726, 1) }
壓縮舊的主數(shù)據(jù)庫。下臺后,舊的主節(jié)點將成為輔助節(jié)點。compact 在舊主節(jié)點上運行。
local_rs1:SECONDARY> db.myCompact.count() 200000 local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 28233728 local_rs1:SECONDARY> db.runCommand( { compact: "myCompact" } ) { "bytesFreed" : 18976768, "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1700199986, 1), "signature" : { "hash" : BinData(0,"D1zMSrcV9n2Deh/2u1Edw4s2pDk="), "keyId" : NumberLong("7236938018798436354") } }, "operationTime" : Timestamp(1700199986, 1) } local_rs1:SECONDARY> db.runCommand( { collStats: "myCompact" } ).totalSize 9256960 root@ubuntu-x64_01:/data/mongodb/data/test# ls -tl | grep 3518756157035530607 -rw------- 1 mongodb mongodb 5341184 11月 17 13:46 collection-8--3518756157035530607.wt -rw------- 1 mongodb mongodb 3915776 11月 17 13:46 index-9--3518756157035530607.wt
分片集群
對于分片集群 ,compact 僅適用于mongod實例。在分片環(huán)境中,運行 compact 分別在每個分片上作為維護操作。
注意: 你不能針對一個mongos實例 發(fā)出 compact
到此這篇關(guān)于Mongodb 刪除集合數(shù)據(jù)后如何釋放磁盤空間的文章就介紹到這了,更多相關(guān)Mongodb釋放磁盤空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決MongoDB6.0報錯:"mongo"不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件
這篇文章主要給大家介紹了關(guān)于解決MongoDB6.0報錯:"mongo"不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05Ubuntu 18.04安裝MongoDB 4.0 的教程詳解
這篇文章主要介紹了Ubuntu 18.04安裝MongoDB 4.0 的教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫
這篇文章主要介紹了在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫的操作步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2021-09-09教大家8天學通MongoDB——第一天 基礎(chǔ)入門篇
MongoDB是目前非常流行的一種非關(guān)系型數(shù)據(jù)庫(NoSQL),因其操作簡單、完全免費、源碼公開等特點,受到了IT從業(yè)人員的青睞,并被廣泛部署于實際的生產(chǎn)環(huán)境中。本文教大家8天學通MongoDB——第一天 基礎(chǔ)入門篇,感興趣的朋友一起來了解了解吧2015-09-09MongoDB快速入門筆記(一)之windows下安裝MongoDB方法
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。本文重點給大家介紹MongoDB快速入門筆記(一)之windows下安裝MongoDB方法,非常不錯具有參考借鑒價值,感興趣的朋友一起看下吧2016-06-06Mongodb基本操作與Python連接mongodb并進行基礎(chǔ)操作的方法
mongodb是基于分布式文件存儲的nosql(非關(guān)系型)數(shù)據(jù)庫,本文分享了mongodb的基礎(chǔ)操作和Python連接并操作mongodb的基礎(chǔ)方法,基礎(chǔ)的不能再基礎(chǔ)了2018-09-09MongoDB Windows安裝服務(wù)方法與注意事項
這篇文章主要介紹了MongoDB Windows安裝服務(wù)方法與注意事項的相關(guān)資料,MongoDB作為一個基于分布式文件存儲的數(shù)據(jù)庫,近兩年大受追捧。數(shù)據(jù)靈活的存取方式和高效的處理使得它廣泛用于互聯(lián)網(wǎng)應用,需要的朋友可以參考下2016-12-12MongoDB批量將時間戳轉(zhuǎn)為通用日期格式示例代碼
這篇文章主要給大家介紹了關(guān)于MongoDB批量將時間戳轉(zhuǎn)為通用日期格式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MongoDB具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-07-07使用Node操作MongoDB數(shù)據(jù)庫的方法
這篇文章主要介紹了使用Node操作MongoDB數(shù)據(jù)庫的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-01-01MongoDB數(shù)據(jù)庫基礎(chǔ)知識整理
這篇文章介紹了MongoDB數(shù)據(jù)庫的基礎(chǔ)知識,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07