Mongodb?刪除集合數(shù)據(jù)后釋放磁盤空間的操作步驟
刪除集合
在Mongodb當(dāng)集合數(shù)據(jù)占用比較多,對(duì)其進(jìn)行清理后,集合存儲(chǔ)空間下降,但磁盤空間并沒釋放,對(duì)于具有活動(dòng)更新的集合來說,有一些可重用的空間是正常的。過多的可重用空間通常是刪除大量數(shù)據(jù)的結(jié)果。
如果您有許多大量集合需要壓縮(或者想要盡可能的釋放磁盤空間),請(qǐng)重新同步副本集的次要成員
如果compact最終沒有釋放足夠的空間, 通過初始同步將通過復(fù)制另一個(gè)成員的數(shù)據(jù)來重建所有數(shù)據(jù)文件。
compact 如果您確實(shí)決定在生產(chǎn)環(huán)境中運(yùn)行,可以考慮將通過以下方式最大限度地減少影響:
- 副本集部署(理想情況下至少三個(gè)數(shù)據(jù)承載成員,沒有仲裁者)
- compact 一次在一臺(tái)輔助設(shè)備上運(yùn)行操作。
- 配置 secondary 為 hidden 在操作期間,競(jìng)爭(zhēng)流量將是基本復(fù)制。
- 重新分配主節(jié)點(diǎn)。
- 壓縮舊的主數(shù)據(jù)庫(kù)。
集合數(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 阻止所有讀寫活動(dòng)。 |
| 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ù)和索引所需的存儲(chǔ)空間,向操作系統(tǒng)釋放不需要的磁盤空間。此操作的有效性取決于工作負(fù)載,并且無法恢復(fù)任何磁盤空間。如果您已從集合中刪除大量數(shù)據(jù)并且不打算替換它,則此命令非常有用。
測(cè)試刪除 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ù)后,磁盤空間和集合存儲(chǔ)大小并沒有減小。 如下
# 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 集合
對(duì)于副本集, 您可以在存儲(chǔ)副本集中的集合和索引上使用 compact ,但是有一些重要的注意事項(xiàng):
主節(jié)點(diǎn)不會(huì)將compact命令復(fù)制到輔助節(jié)點(diǎn)。
您應(yīng)該盡可能在輔助節(jié)點(diǎn)上運(yùn)行compact。如果您無法在輔助節(jié)點(diǎn)上運(yùn)行compact,請(qǐng)使用 force 選項(xiàng)。
從 MongoDB 4.4.17 開始:
compact 運(yùn)行時(shí)輔助節(jié)點(diǎn)可以進(jìn)行復(fù)制。
允許讀取。
壓縮輔助節(jié)點(diǎn)。compact 在輔助節(jié)點(diǎn)之一上運(yùn)行。完成后 compact ,依次在剩余的每個(gè)輔助節(jié)點(diǎn)上重復(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é)點(diǎn)。要讓當(dāng)前的初選下臺(tái)并觸發(fā)選舉,請(qǐng)使用該 rs.stepDown()方法。要提名特定輔助節(jié)點(diǎn),請(qǐng)調(diào)整成員優(yōu)先級(jí)。
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ù)庫(kù)。下臺(tái)后,舊的主節(jié)點(diǎn)將成為輔助節(jié)點(diǎn)。compact 在舊主節(jié)點(diǎn)上運(yùn)行。
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分片集群
對(duì)于分片集群 ,compact 僅適用于mongod實(shí)例。在分片環(huán)境中,運(yùn)行 compact 分別在每個(gè)分片上作為維護(hù)操作。
注意: 你不能針對(duì)一個(gè)mongos實(shí)例 發(fā)出 compact
到此這篇關(guān)于Mongodb 刪除集合數(shù)據(jù)后如何釋放磁盤空間的文章就介紹到這了,更多相關(guān)Mongodb釋放磁盤空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決MongoDB6.0報(bào)錯(cuò):"mongo"不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件
這篇文章主要給大家介紹了關(guān)于解決MongoDB6.0報(bào)錯(cuò):"mongo"不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Ubuntu 18.04安裝MongoDB 4.0 的教程詳解
這篇文章主要介紹了Ubuntu 18.04安裝MongoDB 4.0 的教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫(kù)
這篇文章主要介紹了在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫(kù)的操作步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09
教大家8天學(xué)通MongoDB——第一天 基礎(chǔ)入門篇
MongoDB是目前非常流行的一種非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL),因其操作簡(jiǎn)單、完全免費(fèi)、源碼公開等特點(diǎn),受到了IT從業(yè)人員的青睞,并被廣泛部署于實(shí)際的生產(chǎn)環(huán)境中。本文教大家8天學(xué)通MongoDB——第一天 基礎(chǔ)入門篇,感興趣的朋友一起來了解了解吧2015-09-09
MongoDB快速入門筆記(一)之windows下安裝MongoDB方法
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語言編寫。本文重點(diǎn)給大家介紹MongoDB快速入門筆記(一)之windows下安裝MongoDB方法,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-06-06
Mongodb基本操作與Python連接mongodb并進(jìn)行基礎(chǔ)操作的方法
mongodb是基于分布式文件存儲(chǔ)的nosql(非關(guān)系型)數(shù)據(jù)庫(kù),本文分享了mongodb的基礎(chǔ)操作和Python連接并操作mongodb的基礎(chǔ)方法,基礎(chǔ)的不能再基礎(chǔ)了2018-09-09
MongoDB Windows安裝服務(wù)方法與注意事項(xiàng)
這篇文章主要介紹了MongoDB Windows安裝服務(wù)方法與注意事項(xiàng)的相關(guān)資料,MongoDB作為一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),近兩年大受追捧。數(shù)據(jù)靈活的存取方式和高效的處理使得它廣泛用于互聯(lián)網(wǎng)應(yīng)用,需要的朋友可以參考下2016-12-12
MongoDB批量將時(shí)間戳轉(zhuǎn)為通用日期格式示例代碼
這篇文章主要給大家介紹了關(guān)于MongoDB批量將時(shí)間戳轉(zhuǎn)為通用日期格式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
使用Node操作MongoDB數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了使用Node操作MongoDB數(shù)據(jù)庫(kù)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01
MongoDB數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)整理
這篇文章介紹了MongoDB數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

