如何备份、恢复和迁移 Ubuntu 20.04 上的 MongoDB 数据库

作者選擇了COVID-19救助基金作為為捐贈寫作計劃的一部分收到捐款。

介紹

MongoDB是最流行的NoSQL數據庫引擎之一。它以可伸縮性、健壯性、可靠性和易用性而聞名。在本文中,您將會備份、還原和遷移一個示例的MongoDB數據庫。

導入和導出數據庫意味著處理與其他軟件產品兼容的人類可讀格式的數據。相比之下,MongoDB的備份和還原操作創建或使用MongoDB特定的二進制數據,這不僅保留了數據的一致性和完整性,還保留了其特定的MongoDB屬性。因此,對於遷移,通常最好使用備份和還原,只要源和目標系統是兼容的。

先決條件

在遵循本教程之前,请确保完成以下先决条件:

除非另有说明,在本教程中需要具有root权限的所有命令都应以具有sudo权限的非root用户身份运行。

步骤1 — 在MongoDB中使用JSON和BSON

在继续本文之前,需要对该主题有一些基本了解。如果您有使用其他NoSQL数据库系统(如Redis)的经验,那么在使用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 主題中更進一步時,您可以考慮使用它。

雖然您可以使用匯入和匯出功能來備份和還原您的資料,但有更好的方法來確保 MongoDB 資料庫的完整性。為了備份您的資料,您應該使用指令 mongodump。還原時,使用 mongorestore。讓我們看看它們是如何工作的。

步驟 2 — 使用 mongodump 備份 MongoDB 資料庫

首先讓我們來看看如何備份您的 MongoDB 資料庫。

一個關鍵的 mongodump 參數是 --db,它指定你想要備份的數據庫名稱。如果你沒有指定數據庫名稱,mongodump 會備份你所有的數據庫。第二個重要的參數是 --out,它定義了數據將被傾倒到的目錄。例如,讓我們備份 newdb 數據庫並將其存儲在 /var/backups/mongobackups 目錄中。理想情況下,我們將每個備份存儲在帶有當前日期的目錄中,如 /var/backups/mongobackups/10-29-20

首先創建該目錄 /var/backups/mongobackups:

  1. sudo mkdir /var/backups/mongobackups

然後運行 mongodump:

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/$(date +'%m-%d-%y')

你將看到像這樣的輸出:

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

請注意,在上述目錄路徑中,你使用了 date +'%m-%d-%y' 來自動獲取當前日期。這將允許你在目錄中有備份,如 /var/backups/10-29-20/,這對於自動備份特別方便。

此時,你在目錄 /var/backups/mongobackups/10-29-20/newdb/ 中有了 newdb 數據庫的完整備份。這個備份包含了恢復 newdb 的一切所需的內容,並保留了其所謂的“完整性”。

作為一般規則,你應該定期備份,最好在服務器負載最輕的時候。因此,你可以將 mongodump 命令設置為一個 cron 作業,使其定期運行,例如每天凌晨03:03。

為了完成這個任務,打開 crontab,cron 的編輯器:

  1. sudo crontab -e

當您運行sudo crontab時,您將編輯 root 用戶的 cron 任務。建議這樣做,因為如果您為您的用戶設置 cron,它們可能無法正常執行,特別是如果您的 sudo 配置文件需要密碼驗證。

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

crontab
  1. 3 3 * * * mongodump --out /var/backups/mongobackups/$(date +'\%m-\%d-\%y')

在上述命令中,我們故意省略了--db參數,因為通常您會希望將所有數據庫都備份。此外,特殊字符%必須進行轉義,以符合 cron 語法。

根據您的 MongoDB 數據庫大小,如果備份太多,您可能很快就會耗盡磁盤空間。這就是為什麼還建議定期清理舊的備份或將其壓縮。

例如,要刪除所有舊於七天的備份,您可以使用以下 bash 命令:

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

與前面的mongodump命令類似,您也可以將此添加為 cron 任務。它應該在您開始下一個備份之前運行;對於 03:03 AM 的任務,此刪除將在 03:01 AM 運行。再次打開 crontab:

  1. sudo crontab -e

插入以下行:

crontab
  1. 1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

保存並關閉文件。

完成本步驟中的所有任務將確保您的 MongoDB 數據庫擁有一個適當的備份解決方案。接下來,您將恢復數據庫。

步驟 3 — 使用 mongorestore 還原並遷移 MongoDB 資料庫

當您從之前的備份還原 MongoDB 資料庫時,您將擁有在特定時間拍攝的 MongoDB 資訊的完全副本,包括所有索引和資料類型,這在您想要遷移 MongoDB 資料庫時尤其有用。要還原 MongoDB,我們將使用 mongorestore 命令,它可以與 mongodump 生成的二進制備份一起使用。

讓我們繼續使用 newdb 資料庫的示例,看看我們如何從先前拍攝的備份中還原它。我們首先使用 --nsInclude 參數指定資料庫的名稱。我們將使用 newdb.* 來還原所有集合。如果要還原單個集合,比如 restaurants,則使用 newdb.restaurants

然後,使用 --drop,我們將確保目標資料庫首先被刪除,以便在乾淨的資料庫中還原備份。作為最後一個參數,我們將指定上一次備份的目錄,看起來像這樣:/var/backups/mongobackups/10-29-20/newdb/

一旦您有了有時間戳的備份,您就可以使用此命令來還原它(更新日期以匹配您的日期):

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

您將看到以下類似的輸出:

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

在上述情況下,我們正在將數據還原到創建備份的同一台伺服器上。如果您希望將數據遷移到另一台伺服器並使用相同的技術,您應該將備份目錄,即我們案例中的/var/backups/mongobackups/10-29-20/newdb/,複製到另一台伺服器。

結論

您現在已完成與備份、還原和遷移 MongoDB 數據庫相關的一些重要任務。沒有可靠的備份策略,如此處所描述的策略,生產 MongoDB 伺服器絕不應運行。

您可以在這些DigitalOcean 社群文章中找到更多有關如何配置和使用 MongoDB 的教程。我們還鼓勵您查閱官方MongoDB 文檔,因為它是了解 MongoDB 提供的可能性的絕佳資源。

Source:
https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04