一、前言:
當從MongoDB中删除文檔或集合時,MongoDB并不會将已經占用了的磁盤空間釋放,它會一直維護已經占用了磁盤空間的資料檔案,隻是邏輯上做了删除标記,其實未釋放空間。當用戶端程式再次插入文檔時,MongoDB會從空記錄清單中配置設定存儲空間給新文檔。是以在磁盤空間不足報警時等,為了釋放空間,我們需要對mongodb的資料檔案做碎片整理以及未使用空間的回收。
方法思路有兩種:
進行碎片整理
資料重新拷貝搭建新從庫
二、本次就compact操作記錄下相關流程
定義:對集合中的所有資料和索引進行重寫和碎片整理
指令:
步驟:
連接配接mongo執行個體scondary
切換至集合所在的資料庫
use yourdatabase;
檢視表占用空間大小
查詢預估回收空間
上面指令得到的數字可以/1024/1024/1024得到大概G機關的可以釋放的空間
執行以下指令,對某個集合進行碎片整理
等待執行,傳回{ "ok" : 1 }代表執行完成
可檢視collection占用空間釋放被回收
注意:
隻對WiredTiger引擎的mongo起作用
碎片整理期間,會堵塞執行個體的讀寫操作,故強烈建議在secondary上執行,然後切換主庫,做輪詢操作處理
操作的指令不會進行複制,故需要分别在不同的執行個體上單獨執行一遍
碰到特殊情況要停止運作該指令時,可通過db.currentOp()查詢程序資訊,然後通過db.killOp()幹掉程序