在Ubuntu 14.04上備份,還原和遷移MongoDB資料庫

騰訊雲加社群發表於2018-08-20

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

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

MongoDB是最受歡迎的NoSQL資料庫引擎之一。它以可擴充套件,強大,可靠和易於使用而聞名。在本文中,我們將向您展示如何備份,還原和遷移MongoDB資料庫。

匯入和匯出資料庫意味著以人類可讀的格式處理資料,與其他軟體產品相容。相反,備份和還原操作建立或使用特定於MongoDB的二進位制資料,這不僅保留了資料的一致性和完整性,還保留了其特定的MongoDB屬性。因此,對於遷移,只要源系統和目標系統相容,通常最好使用備份和恢復。如果您使用了Debian系統,可以參考騰訊雲如何在Debian上安裝MongoDB的教程。

準備

在學習本教程之前,請確保完成以下準備:

  • 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中,再次在第一個文件(資料庫行)插入時自動建立結構。

第三,在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 版本功能變更介紹

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

此文已由作者授權騰訊雲+社群釋出,原文連結:cloud.tencent.com/developer/a…

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

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

相關文章