MongoDB如何釋放空閒空間?

2021-09-20 07:41:45 字數 2895 閱讀 3396

當我們從mongodb中刪除文件或集合時,mongodb並不會將已經占用了的磁碟空間釋放,它會一直維護已經占用了磁碟空間的資料檔案,儘管資料檔案中可能存在大大小小的空記錄列表(empty record list)。當客戶端程式再次插入文件時,mongodb會從空記錄列表中分配儲存空間給新文件。那麼為了更加有效的使用磁碟空間,我們需要對mongodb的資料檔案做碎片整理以及未使用空間的**。思想無非兩種:

1、對原資料進行重組

2、僅將資料複製出來,形成僅資料的完整備份

1、compact

2、db.repairdatabase()

3、secondary節點重同步

2、db.copydatabase()

使用方法
use yourdatabase;

db.runcommand();

注意事項
1、在執行命令前請保證你有比較新的備份

2、在使用mmapv1儲存引擎的mongodb上compact需要資料檔案所在分割槽至少有2g的空閒空間

3、在使用wiredtiger儲存引擎的mongodb上,compact命令將重寫集合和索引,且釋放未使用的空間,但使用mmapv1儲存引擎的mongodb上,該命令只對集合的資料檔案進行碎片整理並重新建立其索引。不會釋放空間,在使用mmapv1儲存引擎的mongodb上**空間,建議使用第三種方法「secondary節點重同步」

5、在副本集上執行該命令時,要分別在每個節點執行

6、該命令只能在mongod例項上執行,不能再mongos例項上執行。也就是說針對分片集群的compact操作要分別在每個分片節點上執行。

7、一般該命令執行在secondary節點上,在執行時,會強制節點進入recovering狀態,recovering狀態的例項讀寫操作將被阻塞

8、再碰到特殊情況要停止執行該命令時,可通過db.currentop()查詢程序資訊,然後通過db.killop()乾掉程序

9、compact可能會增加資料檔案的總大小和數量,尤其是第一次執行時。但這不會增加總集合使用的磁碟空間,因為儲存大小是資料庫檔案中分配的資料量,而不是檔案系統上檔案的大小/數量

官網該命令的定義:通過丟無效或損壞的資料老重建資料庫和索引。類似於檔案系統修復命令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節點中指定資料,使之與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("sourcedb","distdb");

將源庫sourcedb。拷貝為distdb。

當然,該命令支援遠端複製。

該命令的完整語法為:

db.copydatabase(《源資料庫名稱》, 《目標資料庫名稱》, 《源mongodb的ip:port>, 《源資料庫連線需要的賬戶》,《密碼》, )

以上:命令必須在目標資料庫伺服器上執行。若源資料庫與目標資料庫存在於乙個mongodb伺服器,《源mongodb的ip:port>, 《源資料庫連線需要的賬戶》,《密碼》都可省略。是身份驗證型別,可選的。

注意事項

1、db.copydatabase()不會阻塞源資料庫和目標資料庫資料的讀寫,因此可能會出現兩份資料不一致的情況

2、db.copydatabase()複製索引資料會鎖定資料庫,此操作也會對其他資料庫產生影響

3、db.copydatabase()不要在mongos例項中使用

4、db.copydatabase()不要用於複製包含分片集合的資料庫

5、在4.0版中更改:db.copydatabase()僅支援scram進行身份驗證fromhost,選項。

除此之外,還有一些方法,像使用匯入/匯出的方法(mongodump/mongorestore),這種方法在資料量非常大的情況是不適用的,因為匯入匯出的方法使用的全量的形式,要保證有足夠的空閒空間來存放匯入的資料。

Oracle不自動釋放空閒連線

oracledbconsoleorcl oracle資料庫控制台服務,orcl是oracle的例項標識,預設的例項為orcl。在執行enterprise manager 企業管理器oem 的時候,需要啟動這個服務。非必須啟動 oraclejobschedulerorcl oracle作業排程 定時器...

vector如何釋放空間的問題

include include using namespace std templatevoid swap vector v2 int main cout swap cout v2 cout v3 v3 swap v3 cout vector v3 swap v3 swap v3 cout vect...

harbor刪除映象,釋放空間

harbor因為相同的標籤的映象重複提交次數過多導致,刪除映象後且gc清理後,磁碟空間沒有釋放。此檔案在harbor安裝目錄下,注釋下面部分,禁止身份驗證 auth token issuer harbor token issuer realm rootcertbundle etc registry ...