入門系列之在Ubuntu 14.04上備份,還原和遷移MongoDB數據庫

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~數據庫

本文由 信姜緣 發表於 雲+社區專欄

MongoDB是最受歡迎的NoSQL數據庫引擎之一。它以可擴展,強大,可靠和易於使用而聞名。在本文中,咱們將向您展現如何備份,還原和遷移MongoDB數據庫。json

導入和導出數據庫意味着以人類可讀的格式處理數據,與其餘軟件產品兼容。相反,備份和還原操做建立或使用特定於MongoDB的二進制數據,這不只保留了數據的一致性和完整性,還保留了其特定的MongoDB屬性。所以,對於遷移,只要源系統和目標系統兼容,一般最好使用備份和恢復。若是您使用了Debian系統,能夠參考騰訊雲如何在Debian上安裝MongoDB的教程。bash

準備

在學習本教程以前,請確保完成如下準備:服務器

  • Ubuntu 14.04 服務器
  • 擁有sudo權限的非root用戶。
  • 導入示例MongoDB數據庫

除非另有說明,不然本教程中須要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數據庫

咱們首先介紹備份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數據庫時,這尤爲有用。爲了恢復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》

問答

Angular2如何處理http響應?

相關閱讀

HTTP/2之服務器推送(Server Push)最佳實踐

如何備份你的MySQL數據庫

MySQL 8.0 版本功能變動介紹

雲學院 · 課程推薦 | 騰訊高級工程師,帶你快速入門機器學習

此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/dev...

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索