上一篇 提到了如何安裝、操作 MongoDB,這篇要討論如何自動備份資料庫。

雖然資料庫中本來就有一塊是負責做 concurrecy control, logging & recovery,但是如果在機器被打下來、資料庫被勒索,或是純粹只是需要搬動到另外一台機器等等,這些都是需要自己進行備份和還原的。這篇文章就是要介紹備份和還原的指令,並討論如何做到自動備份。

備份 MongoDB 資料庫

由於 MongoDB 是個 Schema-less 的 NoSQL 資料庫,並沒有辦法直接匯出一個 CSV 或 SQL 檔案,但我們仍然可以使用 mongodump 這個指令匯出一包東西。

通常可以這樣使用:

# mongodump -d 資料庫名稱 -o 備份檔案
mongodump -d blog -o blog-backup

這樣會在 blog-backup/blog 裡面產生幾個檔案,由於我們只有一個 collection,所以有兩個檔案:一個是 articles.bson、另一個是 articles.metadata.json

.bson 檔用來存放的是實際的資料,而 .json 檔則是用來存放欄位的描述。

所以 $n$ 個 collections 會產生 $2n$ 個檔案。

如果要打包這個資料夾,建議可以用 tar 來打包,例如:

tar zcvf blog.tgz blog-backup

就可以把這個資料夾打包成一個壓縮檔。

如何把這些壓縮檔丟到別的機器去?可以參考 這篇文章 提到的 scp 方法。

還原 MongoDB 資料庫

假設我們到新的電腦,要把這個檔案還原回去的話,首先先解開我們打包的資料夾:

tar zxvf blog.tgz

再假設我們要把這個資料庫還原,並取一個新名字叫 blog2 的話,可以這樣操作:

mongorestore -d blog2 --directoryperdb ./blog-backup/blog

這樣就可以成功還原。如果資料庫已經存在的話,預設是不會還原並寫入的;如果要強制還原的話,可以加上 --drop 參數。

如何自動備份 MongoDB?

還記得透過 Certbot 安裝的憑證因為只能用三個月,所以每幾個月就要重新簽一次嗎?那時候就是用 Crontab 來達成自動排程的目的。

你也可以寫一個腳本,透過 MongoDB 自動備份出壓縮檔後,上傳到其他主機。最後再透過 Crontab 設定每個月執行一次這個腳本,這樣就達到自動異地備份的功能囉!

本篇文章同步發表在 iT邦幫忙

延伸閱讀