本文介紹ApsaraDB for MongoDB釋放磁碟空間的方法。
背景資訊
MongoDB從3.2版本開始,使用WiredTiger作為預設的儲存引擎。ApsaraDB for MongoDB資料都配置了storage.directoryPerDB:true
參數,於是每個資料庫以獨立檔案夾的形式儲存在磁碟上,而資料集合都是對應資料庫檔案夾下獨立的檔案。storage.directoryPerDB:true
參數的更多資訊,請參見storage.directoryPerDB。
操作步驟
1.檢查是否存在廢棄的索引、集合或者資料庫,然後使用dropIndexes、drop、dropDatabase命令刪除對應的索引、集合或者資料,該類命令執行後,會立即將對應的檔案刪除,從而達到釋放磁碟空間的目的。
2.檢查是否存在不需要的文檔,然後使用delete命令,刪除對應的文檔。和MySQL類似,MongoDB的文檔刪除也可以看作是標記刪除,只是將對應的一小Block Storage空間標記為空白閑,等待被重用,因此刪除文檔命令,不能立即釋放磁碟空間,如果想要立即釋放這部分空閑空間,請查看步驟3。
3.檢查集合是否存在大量的空閑空間,通過collStats命令,比較StorageSize
和freeStorageSize
這兩個欄位,然後使用compact命令回收閒置物理空間,具體操作請參見回收磁碟片段以提升磁碟利用率。
說明
compact
命令,需要在每個節點上分別執行。MongoDB 4.4之前的版本,執行
compact
命令時,會阻塞其他所有的操作,請謹慎操作。使用cursor.forEach命令,將文檔全部複製到新的集合,然後重新命名的方法也能達到釋放磁碟空間的目的。該方法僅適用於離線情境。