MongoDB3.2磁碟碎片整理---compact詳述
阿新 • • 發佈:2018-12-24
前序:
由於業務原因,需要將過期資料刪除,之前也已經寫了一篇關於如何定期刪除資料的文章,但有一個問題出現了,
頻繁刪除資料之後,會產生很多磁碟碎片,這些碎片如果沒有被重複利用,進而會影響查詢效能(表查詢時仍然會掃描這部分刪除資料的磁碟空間塊),隨需要處理之
當從MongoDB中刪除文件(Documents)或集合(Collections)後,MongoDB不會將Disk空間釋放給OS,MongoDB在資料檔案(Data Files)中維護Empty Records的列表。當重新插入資料後,MongoDB從Empty Records列表中分配儲存空間給新的Document,因此,不需要重新開闢空間。為了更新有效的重用Disk空間,必須重新整理資料碎片。
有好幾種方法處理: ①使用compact命令 ②重建collection ③新加一個secondary節點,然後將此節點切換為primary(資料量非常大的情況下,為了不影響業務) 後兩種方法以後有時間再細說,也是網友提供的,今天只看Compact命令的實現
簡介:
官方解釋是:compact命令能夠重寫和重組集合的data和index
格式:
db.runCommand({ compact: <collection name>,force:<boolen> } ) ---紅色部分是可選項
compact命令之後寫你想要整理的collection名字
force引數用於replica set中primary整理時之用,否則會報錯
說明:
在compact期間會阻塞其他針對此collection的操作,所以最好在業務不繁忙的時候進行compact動作;
針對compact完成之後,不同引擎會有不同的磁碟影響
WireTiger引擎:
在此引擎的資料庫下,compact會整理碎片,並且釋放未使用的磁碟空間給系統
MMAPv1引擎:
在此引擎的資料庫下,compact會整理碎片,重建索引,但不會將未使用的空間釋放給系統,後續新插入的資料依然可以使用這些空間
在複製集架構下的一些注意:
compact命令不會自動複製到secondary節點執行,compact在每個節點成員中都是獨立的,在Primary,secondary中執行時都要使用force引數,
當在secondary的collection上執行compact命令時,此secondary節點會變成RECOVERING狀態,且無法提供讀操作
在capped collection中不必使用compact命令,因為它本身就是固定空間
測試驗證:
在單例項情況下:
在複製集架構primary上使用時,如果不使用force引數,則會報錯,如下:
若想要對著一個數據庫的所有collection集合進行compact命令的話,可以參考使用repairDatabase命令哦
>use testDB
>db.runCommand({repairDatabase:1})
注:這個命令一定要謹慎使用,能不用的情況下儘量不用,因為會花費很多時間和效能
官網的一句話是這樣說的:
TherepairDatabasecommand compacts all collections in the database. It is identical to running the compactcommand
on each collection individually
當從MongoDB中刪除文件(Documents)或集合(Collections)後,MongoDB不會將Disk空間釋放給OS,MongoDB在資料檔案(Data Files)中維護Empty Records的列表。當重新插入資料後,MongoDB從Empty Records列表中分配儲存空間給新的Document,因此,不需要重新開闢空間。為了更新有效的重用Disk空間,必須重新整理資料碎片。
有好幾種方法處理: ①使用compact命令 ②重建collection ③新加一個secondary節點,然後將此節點切換為primary(資料量非常大的情況下,為了不影響業務) 後兩種方法以後有時間再細說,也是網友提供的,今天只看Compact命令的實現
在複製集架構primary上使用時,如果不使用force引數,則會報錯,如下:
若想要對著一個數據庫的所有collection集合進行compact命令的話,可以參考使用repairDatabase命令哦
>use testDB
>db.runCommand({repairDatabase:1})
注:這個命令一定要謹慎使用,能不用的情況下儘量不用,因為會花費很多時間和效能
官網的一句話是這樣說的:
TherepairDatabasecommand compacts all collections in the database. It is identical to running the