您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關MongoDB中怎么釋放空閑空間,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、compat
官網對該命令的定義:對集合中的所有數據和索引進行重寫和碎片整理。
使用方法
use yourdatabase; db.runCommand({ compact : 'yourCollection' });
注意事項
1、在執行命令前請保證你有比較新的備份
2、在使用MMAPv1存儲引擎的MongoDB上compact需要數據文件所在分區至少有2G的空閑空間
3、在使用WiredTiger存儲引擎的MongoDB上,compact命令將重寫集合和索引,且釋放未使用的空間,但使用MMAPv1存儲引擎的MongoDB上,該命令只對集合的數據文件進行碎片整理并重新創建其索引。不會釋放空間,在使用MMAPv1存儲引擎的MongoDB上回收空間,建議使用第三種方法“secondary節點重同步”
4、使用MMAPv1存儲引擎的MongoDB中的Capped Collections,是無法被壓縮的,但使用WiredTiger存儲引擎的MongoDB在執行compact時會進行壓縮。
5、在副本集上運行該命令時,要分別在每個節點執行
6、該命令只能在mongod實例上執行,不能再mongos實例上運行。也就是說針對分片集群的compact操作要分別在每個分片節點上執行。
7、一般該命令運行在secondary節點上,在執行時,會強制節點進入RECOVERING狀態,RECOVERING狀態的實例讀寫操作將被阻塞
8、再碰到特殊情況要停止運行該命令時,可通過db.currentOp()查詢進程信息,然后通過db.killOp()干掉進程
9、compact可能會增加數據文件的總大小和數量,尤其是第一次運行時。但這不會增加總集合使用的磁盤空間,因為存儲大小是數據庫文件中分配的數據量,而不是文件系統上文件的大小/數量
10、使用MMAPv1存儲引擎的MongoDB中的Capped Collections,是無法被壓縮的,但使用WiredTiger存儲引擎的MongoDB在執行compact時會進行壓縮。
二、db.repairDatabase()
官網該命令的定義:通過丟無效或損壞的數據老重建數據庫和索引。類似于文件系統修復命令fsck。所以此命令主要是用于修復數據。
使用方法
use yourdatabase; db.repairDatabase();
注意事項
1、db.repairDatabase()主要用于修復數據。若你擁有數據的完整副本,且有權限訪問,請使用第三種方法“secondary節點重同步”
2、在執行命令前請保證你有比較新的備份
3、此命令會完全阻塞數據庫的讀寫,謹慎操作
4、此命令執行需要數據文件所在位置有等同于所有數據文件大小總和的空閑空間再加上2G
5、在使用MMAPv1存儲引擎的secondary節點上執行該命令可以壓縮集合數據
6、在使用WiredTiger存儲引擎的MongoDB庫上執行不會有壓縮的效果
7、再碰到特殊情況要停止運行該命令時,可通過db.currentOp()查詢進程信息,然后通過db.killOp()干掉進程
8、非常消耗時間
三、secondary節點重同步
主要思想就是:刪除secondary節點中指定數據,使之與primary重新開始數據同步。當副本集成員數據太過陳舊,也可以使用重新同步。數據的重新同步與直接復制數據文件不同,MongoDB會只同步數據,因此重同步完成后的數據文件是沒有空集合的,以此實現了磁盤空間的回收。
使用方法
首先必須確保數據有完整的備份。
1、若是primary節點,先強制將之變為secondary節點,否則跳過此步驟:
rs.stepdown(120);
2、然后在primary上刪除secondary節點:
rs.remove("IP:port");
3、刪除secondary節點dbpath下的所有文件。
4、將節點重新加入集群,然后使之自動進行數據的同步:
rs.add("IP:port");
5、等數據同步完成后,循環1-4的步驟可以將集群中所有節點的磁盤空間釋放
針對一些特殊情況,不能下線secondary節點的,可以新增一個節點到副本集中,然后secondary就自動開始數據的同步了。
總的來說,重同步的方法是比較好的,第一基本不會阻塞副本集的讀寫,第二消耗的時間相對前兩種比較短
四、db.copyDatabase()
mongodb還支持在線復制數據:db.copyDatabase("from","to","IP:port"),此種方法也能釋放空間,因為db.copyDatabase復制的數據,而不是表示在磁盤中的數據文件。但,該命令在4.0版本起被棄用;3.x版本還能繼續使用
如:
db.copyDatabase("sourceDB","DistDB");
將源庫sourceDB。拷貝為DistDB。
當然,該命令支持遠程復制。
該命令的完整語法為:
db.copyDatabase(<源數據庫名稱>, <目標數據庫名稱>, <源mongodb的IP:port>, <源數據庫連接需要的賬戶>,<密碼>, <mechanism>)
以上:命令必須在目標數據庫服務器上執行。若源數據庫與目標數據庫存在于一個MongoDB服務器,<源mongodb的IP:port>, <源數據庫連接需要的賬戶>,<密碼>都可省略。<mechanism>是身份驗證類型,可選的。
注意事項
1、db.copyDatabase()不會阻塞源數據庫和目標數據庫數據的讀寫,因此可能會出現兩份數據不一致的情況
2、db.copyDatabase()復制索引數據會鎖定數據庫,此操作也會對其他數據庫產生影響
3、db.copyDatabase()不要在mongos實例中使用
4、db.copyDatabase()不要用于復制包含分片集合的數據庫
5、在4.0版中更改:db.copyDatabase()僅支持SCRAM進行身份驗證fromhost,<mechanism>選項。
以上就是MongoDB中怎么釋放空閑空間,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。