歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~數據庫
本文由 信姜緣 發表於 雲+社區專欄
MongoDB是最受歡迎的NoSQL數據庫引擎之一。它以可擴展,強大,可靠和易於使用而聞名。在本文中,咱們將向您展現如何備份,還原和遷移MongoDB數據庫。json
導入和導出數據庫意味着以人類可讀的格式處理數據,與其餘軟件產品兼容。相反,備份和還原操做建立或使用特定於MongoDB的二進制數據,這不只保留了數據的一致性和完整性,還保留了其特定的MongoDB屬性。所以,對於遷移,只要源系統和目標系統兼容,一般最好使用備份和恢復。若是您使用了Debian系統,能夠參考騰訊雲如何在Debian上安裝MongoDB的教程。bash
在學習本教程以前,請確保完成如下準備:服務器
除非另有說明,不然本教程中須要root權限的全部命令都應做爲具備可使用sudo權限的非root用戶運行。機器學習
在繼續本文以前,須要對此問題有一些基本的瞭解。若是您有使用MySQL等流行的關係數據庫系統的經驗,那麼在使用MongoDB時可能會發現一些類似之處。編輯器
您應該知道的第一件事是MongoDB使用json和bson(二進制json)格式來存儲其信息。Json是人類可讀的格式,很是適合導出和最終導入數據。您可使用任何支持json的工具進一步管理導出的數據,包括簡單的文本編輯器。工具
一個示例json文檔以下所示:學習
Example of json Format
{"address":[ {"building":"1007", "street":"Park Ave"}, {"building":"1008", "street":"New Ave"}, ]}
Json使用很是方便,但它不支持bson中可用的全部數據類型。這意味着若是使用json,將會出現所謂的「保真度丟失」。對於備份和恢復,最好使用二進制bson。大數據
其次,您沒必要擔憂顯式建立MongoDB數據庫。若是您指定用於導入的數據庫尚不存在,則會自動建立該數據庫。集合'(數據庫表)結構的狀況更好。與其餘數據庫引擎相比,在MongoDB中,再次在第一個文檔(數據庫行)插入時自動建立結構。ui
第三,在MongoDB中讀取或插入大量數據(例如本文的任務)可能會佔用大量資源並佔用大量CPU,內存和磁盤空間。重要的是,須要考慮到MongoDB常常用於大型數據庫和大數據。解決此問題的最簡單方法是在夜間或非高峯時段運行導出和備份。
第四,若是您有一個繁忙的MongoDB服務器,其信息在數據庫導出或備份過程當中發生變化,則信息一致性可能會有問題。這個問題沒有簡單的解決方案,但在本文的最後,您將看到有關進一步閱讀複製的建議。
雖然您可使用導入和導出功能來備份和還原數據,但還有更好的方法能夠確保MongoDB數據庫的完整性。要備份數據,您應該使用mongodump
命令。要恢復,請使用mongorestore
命令。讓咱們看看它們是如何工做的。
咱們首先介紹備份MongoDB數據庫。
mongodumpis
的一個重要參數--db
,它指定要備份的數據庫的名稱。若是未指定數據庫名稱,mongodump
將備份全部數據庫。第二個重要參數是--out
,它指定轉儲數據的目錄。咱們舉一個例子來備份newdb數據庫並將其存儲在/var/backups/mongobackups
目錄中。理想狀況下,咱們將每一個備份都放在當前日期的目錄中,如/var/backups/mongobackups/01-20-16(2016年1月20日)
。首先,讓咱們使用如下命令建立該目錄:/var/backups/mongobackups
$ sudo mkdir /var/backups/mongobackups
而後咱們的備份命令應以下所示:
$ sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`
成功執行的備份將具備以下輸出結果:
Output of mongodump
2016-01-20T10:11:57.685-0500 writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson 2016-01-20T10:11:57.907-0500 writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json 2016-01-20T10:11:57.911-0500 done dumping newdb.restaurants (25359 documents) 2016-01-20T10:11:57.911-0500 writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson
請注意,在上面的目錄路徑中,咱們使用了日期date+"%m-%d-%y"
,它自動獲取當前日期。這將容許咱們將目錄放在目錄/var/backups/01-20-16/
中。當咱們自動執行備份時,這尤爲方便。
此時,您能夠在/var/backups/mongobackups/01-20-16/newdb/
目錄中對newdb
數據庫完整備份。此備份包含正確恢復newdb
並保留其所謂的「保真度」的全部內容。
做爲通常規則,您應該按期進行備份,例如天天進行備份,最好是在服務器負載最小的時候進行備份。所以,您能夠將mongodump
命令設置爲cron
做業,以便按期運行,例如天天凌晨03:03。要完成這個打開的crontab,cron的編輯器以下所示:
$ sudo crontab -e
請注意,在運行sudo crontab
時,您將爲root用戶編輯cron做業。建議這樣作,由於若是您爲用戶設置了crons,它們可能沒法正確執行,尤爲是當您的sudo配置文件須要密碼驗證時。
在crontab提示符內插入如下mongodump
命令:
Crontab window
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`
在上面的命令中,咱們有意省略了--db
參數,由於一般須要您備份全部數據庫。
根據您的MongoDB數據庫大小,您可能很快就會耗盡備份太多的磁盤空間。這就是爲何還建議按期清理舊備份或壓縮它們。例如,要刪除超過7天的全部備份,可使用如下bash命令:
$ find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
與上一個mongodump
命令相似,此命令也能夠添加爲cron做業。它應該在您開始下一次備份以前運行,例如在凌晨03:01。爲此,再次打開crontab:
$ sudo crontab -e
以後插入如下行:
Crontab window
3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
完成此步驟中的全部任務將確保爲MongoDB數據庫提供良好的備份解決方案。
經過從先前的備份(例如上一步中的一個)恢復MongoDB數據庫,您將可以得到在特定時間獲取的MongoDB信息的精確副本,包括全部索引和數據類型。當您想要遷移MongoDB數據庫時,這尤爲有用。爲了恢復MongoDB,咱們將使用mongorestore
與生成的二進制備份一塊兒使用的命令mongodump
。
讓咱們繼續使用newdb數據庫爲例,看看咱們如何從之前的備份中恢復它。做爲參數,咱們首先使用--db參數指定數據庫的名稱。而後使用--drop
,咱們將確保首先刪除目標數據庫,以便在乾淨的數據庫中恢復備份。做爲最後一個參數,咱們將指定最後一個備份/var/backups/mongobackups/01-20-16/newdb/
的目錄。
所以整個命令將以下所示(替換爲您要恢復的備份日期):
$ sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/newdb/
成功執行將顯示如下輸出結果:
Output of mongorestore
2016-01-20T10:44:47.876-0500 building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir 2016-01-20T10:44:47.908-0500 reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json 2016-01-20T10:44:47.909-0500 restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson 2016-01-20T10:44:48.591-0500 restoring indexes for collection newdb.restaurants from metadata 2016-01-20T10:44:48.592-0500 finished restoring newdb.restaurants (25359 documents) 2016-01-20T10:44:48.592-0500 done
在上面的例子中,咱們將在建立備份的同一服務器上恢復數據。若是您但願將數據遷移到另外一臺服務器並使用相同的技術,則只需將備份目錄(在咱們的示例中爲/var/backups/mongobackups/01-20-16/newdb/
)複製到另外一臺服務器便可。
本文向您介紹了在備份,還原和遷移數據庫方面管理MongoDB數據的要點。
複製不只對可伸縮性有用,並且對當前主題也很重要。複製容許您在從故障恢復主服務器時從MongoDB服務器中不間斷地繼續運行MongoDB服務。回想一下,備份一般在夜間進行,若是您決定在晚上恢復備份,則會丟失自上次備份以來的全部更新。對於生產環境的服務器,咱們建議您使用騰訊雲雲關係型數據庫,可將您從耗時的數據庫管理任務中解放出來,讓您有更多時間專一於您的應用和業務。
參考文獻:《How To Back Up, Restore, and Migrate a MongoDB Database on Ubuntu 14.04》
問答
相關閱讀
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/dev...
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!