2017-06-29 76 views
0

我有一個MongoDB服務器,我用mongodump命令來創建備份。我運行命令mongodump --out ./mongo-backup,然後tar -czf ./mongo-backup.tar.gz ./mongo-backup,然後gpg --encrypt ./mongo-backup.tar.gz > ./mongo-backup.tar.gz.gpg並將此文件發送到備份服務器。MongoDB備份 - > tar - > gz - > gpg

我的MongoDB數據庫有20GB用MongoDB的show dbs命令,MongoDB的mongodump備份目錄只有3.8GB,MongoDB的gzip壓縮,壓縮包只有118MBgpg文件只有119MB大小。

這怎麼可能將20GB數據庫減少到119MB文件?它容錯嗎?

我試圖創建新的服務器(克隆生產),啓用防火牆,以確保沒有人可以連接和運行此備份過程。我創建全新的服務器和進口數據也有一些不同之處:

我跑從蒙戈相同的命令外殼use db1; db.db1_collection1.count();use db2; db.db2_collection1.count();和結果:

  • 807843與807831(db1.collection1源服務器db1.collection1恢復服務器
  • 3044401與3044284(db2.collection1源服務器db2.collection1恢復服務器
+0

您正在使用哪種特定版本的MongoDB服務器以及備份的部署類型(獨立,副本集或分片羣集)? – Stennie

+0

@Stennie我正在使用MongoDB 3.3獨立。 – mimosvk

+0

3,3將是一個開發版本..你實際上意味着3.4.x?你可以在'mongo' shell中檢查'db.version()'嗎?您是否使用默認存儲引擎(WiredTiger)? – Stennie

回答

0

如果您已驗證恢復的數據中的文檔/集合的數量和大小,則儘管所描述的比率不正常,但此方案是可能的。

我的MongoDB數據庫有20GB用MongoDB的show dbs命令

這說明你磁盤上的文件,包括從以前的數據刪除存在預分配的空間的大小。預分配的空間可供重用,但一些MongoDB存儲引擎比其他存儲引擎更高效。

MongoDB的mongodump備份目錄只有3.8GB

mongodump工具(如v3.2.11,其中你提到使用),除非你指定--gzip選項導出數據的未壓縮副本。這個總數應該代表您的實際數據大小,但不包括用於索引的存儲空間。索引定義由mongodump導出,並且在通過mongorestore重新加載轉儲時索引將被重建。

使用WiredTiger時,未壓縮的mongodump輸出通常大於磁盤上的文件大小,默認情況下是壓縮的。對於將來的備份,我會考慮使用mongodump的內置archiving and compression options來爲您節省一個額外的步驟。

由於您的mongodump輸出顯着小於存儲大小,因此您的數據文件要麼高度碎片化,要麼在數據庫中存在一些其他未記錄的數據,例如索引或數據。例如,如果您之前已將此服務器初始化爲副本集成員,則數據庫將包含大量預分配的replication oplog,該數據庫不會被mongodump導出。

通過運行WiredTiger集合的compact命令,您可以回收過量的未使用空間。但是,有一個重要警告:在集合上運行compact將阻止正在運行的數據庫的操作,因此只應在計劃維護期間使用。

MongoDB的gzip壓縮,壓縮包只有118MBgpg文件只有119MB大小。

由於mongodump輸出在默認情況下是未壓縮的,壓縮會根據您的數據產生顯着差異。但是,3.8GB至119MB似乎不合理,除非您的數據有特別之處(大量小型館藏?重複數據?)。我會再次檢查您的還原數據是否與收集計數,文檔計數,數據大小和索引相匹配。

+0

感謝您的答覆。現在很清楚。我該如何「仔細檢查」我的數據?我只使用了'show dbs;'輸出和'db.collections.count();'。 – mimosvk

+0

我更喜歡在備份後使用gzip,因爲在另一個Mongo服務器上它會減慢備份過程。當'mongodump'訪問數據庫時,我需要最小化時間,因爲在備份時間,我停止了來自web服務器的所有寫操作(進程)。當轉儲完成在磁盤上時,我不在乎時間爲gzip + tar和gpg。我在'mongodump'結束之後立即開始所有進程。 – mimosvk

+0

@mimosvk沒有規定的方法將恢復的數據與原始數據進行比較,但可以從數據庫,集合和索引的before vs after計數開始。在你的描述中,你提到一些收集數量在源和還原的服務器上略有不同。如果您針對活動的MongoDB部署運行'mongodump',則會出現這種情況;在'mongodump'運行時發生的更新可能不會被捕獲到輸出中。使用副本集的部署,您可以運行'mongodump --oplog'來捕獲在'mongodump'操作過程中發生的寫入。 – Stennie

相關問題