1. 程式人生 > >MongoDB3.2磁碟碎片整理---compact詳述

MongoDB3.2磁碟碎片整理---compact詳述

前序: 由於業務原因,需要將過期資料刪除,之前也已經寫了一篇關於如何定期刪除資料的文章,但有一個問題出現了, 頻繁刪除資料之後,會產生很多磁碟碎片,這些碎片如果沒有被重複利用,進而會影響查詢效能(表查詢時仍然會掃描這部分刪除資料的磁碟空間塊),隨需要處理之
當從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