Mongodb?刪除集合數(shù)據(jù)后釋放磁盤空間的操作步驟
刪除集合
在Mongodb當(dāng)集合數(shù)據(jù)占用比較多,對其進(jìn)行清理后,集合存儲空間下降,但磁盤空間并沒釋放,對于具有活動更新的集合來說,有一些可重用的空間是正常的。過多的可重用空間通常是刪除大量數(shù)據(jù)的結(jié)果。
如果您有許多大量集合需要壓縮(或者想要盡可能的釋放磁盤空間),請重新同步副本集的次要成員
如果compact最終沒有釋放足夠的空間, 通過初始同步將通過復(fù)制另一個成員的數(shù)據(jù)來重建所有數(shù)據(jù)文件。
compact 如果您確實決定在生產(chǎn)環(huán)境中運行,可以考慮將通過以下方式最大限度地減少影響:
- 副本集部署(理想情況下至少三個數(shù)據(jù)承載成員,沒有仲裁者)
- compact 一次在一臺輔助設(shè)備上運行操作。
- 配置 secondary 為 hidden 在操作期間,競爭流量將是基本復(fù)制。
- 重新分配主節(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)釋放不需要的磁盤空間。此操作的有效性取決于工作負(fù)載,并且無法恢復(fù)任何磁盤空間。如果您已從集合中刪除大量數(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.wtCompact 集合
對于副本集, 您可以在存儲副本集中的集合和索引上使用 compact ,但是有一些重要的注意事項:
主節(jié)點不會將compact命令復(fù)制到輔助節(jié)點。
您應(yīng)該盡可能在輔助節(jié)點上運行compact。如果您無法在輔助節(jié)點上運行compact,請使用 force 選項。
從 MongoDB 4.4.17 開始:
compact 運行時輔助節(jié)點可以進(jìn)行復(fù)制。
允許讀取。
壓縮輔助節(jié)點。compact 在輔助節(jié)點之一上運行。完成后 compact ,依次在剩余的每個輔助節(jié)點上重復(fù)該操作。
# 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é)點。要讓當(dāng)前的初選下臺并觸發(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 分別在每個分片上作為維護(hù)操作。
注意: 你不能針對一個mongos實例 發(fā)出 compact
到此這篇關(guān)于Mongodb 刪除集合數(shù)據(jù)后如何釋放磁盤空間的文章就介紹到這了,更多相關(guān)Mongodb釋放磁盤空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MongoDB中的push操作詳解(將文檔插入到數(shù)組)
$push操作符添加指定的值到數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于MongoDB中push操作(將文檔插入到數(shù)組)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
windows安裝mongodb6.x并設(shè)置用戶名密碼的詳細(xì)過程
這篇文章主要介紹了windows安裝mongodb6.x并設(shè)置用戶名密碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
關(guān)于Mongodb參數(shù)說明與常見錯誤處理的總結(jié)
這篇文章主要給大家介紹了關(guān)于Mongodb參數(shù)說明與常見錯誤處理的相關(guān)資料,文中通過一步步的步驟介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
Navicat遠(yuǎn)程連接MongoDB最全實現(xiàn)方法以及報錯解決
這篇文章主要給大家介紹了關(guān)于Navicat遠(yuǎn)程連接MongoDB最全實現(xiàn)方法以及報錯解決的相關(guān)資料,文中通過圖文將實現(xiàn)的步驟一步步介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-03-03
【MongoDB for Java】Java操作MongoDB數(shù)據(jù)庫
本篇文章現(xiàn)在我們就用Java來操作MongoDB的數(shù)據(jù)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
教你使用mongoose實現(xiàn)多集合關(guān)聯(lián)查詢
這篇文章主要給大家介紹了關(guān)于如何使用mongoose實現(xiàn)多集合關(guān)聯(lián)查詢的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02
關(guān)于Mongodb 認(rèn)證鑒權(quán)你需要知道的一些事
最近因為mongodb被黑了,早先我就疑惑過怎么這東西開啟服務(wù)就能用了,后來找了各方資料,知道MongoDB默認(rèn)是沒有鑒權(quán)的,所以這篇文章主要給大家介紹了關(guān)于Mongodb認(rèn)證鑒權(quán)你需要知道的一些事,需要的朋友可以參考下。2017-10-10

