1. 程式人生 > >如何在Ubuntu 14.04上備份、恢復及遷移MongoDB資料庫

如何在Ubuntu 14.04上備份、恢復及遷移MongoDB資料庫

MongoDB可謂目前人氣最高的NoSQL資料庫引擎之一。其憑藉著出色的可擴充套件性、可靠性與易用性徵服了無數使用者。今天,我們將共同探討如何備份、恢復及遷移MogoDB資料庫。

對資料庫進行匯入與匯出意味著需要以人類可讀的格式處理資料,且確保其與其它軟體產品相相容。相比之下,備份與恢復操作則建立或使用MongoDB專用的二進位制資料,其不僅能夠保護資料本身的統一性與完整性,同時亦擁有獨特的MongoDB屬性。因此,只要源與目標系統彼此相容,我們一般更傾向於使用備份與恢復機制。

先決條件

在開始本教程前,大家需要首先參考以下條件:

另外,除了部分特例,所有要求root許可權的命令都應以非root sudo使用者執行。

相關基礎

如果大家瞭解MySQL等熱門關係資料庫系統,就會發現MongoDB的使用方式與其非常相似。

在上手MongoDB時,首先要了解的是json與bson(binary json)格式,它們負責對資訊進行儲存。Json是一種人類可閱讀格式,更適用於資料的匯出與匯入。大家可以利用任何支援json格式的工具進行資料匯出,包括文字編輯器。

下面來看json示例文件:

Example of json Format

{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}

Json格式易於處理,但卻無法支援bson中的全部資料型別。這意味著如果選擇使用json,則會發現部分資訊“失真”。因此在備份與恢復工作中,我們最好選擇二進位制bson。

另外,大家不必在建立MongoDB資料庫方面下太大功夫。如果大家指定要匯入的資料庫並不存在,系統會自動進行建立。更重要的是,其採用collection(資料庫表)結構。相較於其它資料庫引擎,MongoDB的結構能夠根據插入的第一個文件(資料庫行)自動建立。

第三,MongoDB所讀取或者插入的大量資料可能佔用大量資源,包括CPU、記憶體與磁碟空間。在利用MongoDB處理大型資料集及大資料時,這一點必須認真考量。最簡單的解決方案就是在夜間或非高峰時段進行資料匯出與備份。

第四,如果大家的MongoDB伺服器在資料庫匯出或備份過程中發生資訊變更,則可能影響到資訊一致性。這一難題沒有簡單辦法可以解決,不過在本文結尾,我們將針對複製操作給出參考資料。

雖然在資料備份與恢復時,匯入與匯出功能能夠實現這一效果,但大家也可以利用其它更好的辦法來確保MongoDB資料庫的完整性。要對資料進行備份,大家應當使用mongodump命令。而在恢復時,則使用mongorestore。

備份MongoDB資料庫

首先來看MongoDB資料庫的備份方式。

Mongodump命令的一項重要引數正是–db,其負責指定大家希望備份的資料庫名稱。如果大家不指定資料庫名稱,則mongodump會備份全部資料庫。第二項為–out,用於指定資料備份至哪個目錄。假設我們希望將newdb資料庫儲存在/var/backups/mongobackups目錄下,則備份資料處於/var/backups/mongobackups/01-20-16。首先,使用以下命令建立/var/backups/mongobakcups目錄:

  • 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

請注意,我們在前面的目錄路徑處使用了+”%m-%d-%y”,其會直接獲取當前資料,並將其備份至/var/backups/01-20-16/目錄當中。這一機制非常適用於自動備份。

現在,大家已經在/var/backups/mongobackups/01-20-16/newdb/目錄中擁有了完整的newdb資料庫備份。此備份副本包含一切恢復所必需的newdb資訊,也就是所謂“保真”。

一般來講,我們需要對資料庫進行定期備份,例如每天一次或者選擇伺服器負載較低的時段。因此,大家可以將mongodump命令設定為cron任務以定期執行,命令如下:

  • sudo crontab -e

請注意,sudo crontab要求我們以root使用者編輯該cron任務。

在crontab提示符下插入以下mongodump命令:

Crontab window

3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

在以上命令中,我們使用了–db引數以確保全部資料庫都能得到備份。

根據MongoDB資料庫的具體規模,過為頻繁的備份可能導致磁碟空間不足。因此我們需要定期清除舊有備份或者進行壓縮。例如通過以下命令每七天刪除全部舊有備份:

  • find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

這條命令也可被新增為cron任務。其應當在開始下一次備份前執行,因此下面再次開啟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的複製操作。

複製功能不僅能夠實現可擴充套件性,同時也有相當重要的現實意義。複製允許我們在繼續利用從MongoDB伺服器執行MongoDB服務的同時,對主伺服器進行恢復。另外,複製功能還可實現操作日誌(oplog)機制,其能夠記錄全部對資料做出修改的操作。大家可以利用該日誌對最後一次備份之後的資料進行恢復。備份工作通常在夜間進行,因此如果大家決定利用夜間的備份副本進行恢復,往往會錯失大量資料更新。在這種情況下,日誌恢復就變得非常重要了。

翻譯:diradw