iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0
Modern Web

Node JS-Back end見聞錄系列 第 18

Node.js-Backend見聞錄(17):實作-會員系統(六)-延伸-關於資料庫備份

Node.js-Backend見聞錄(17):實作-會員系統(六)-延伸-關於資料庫備份

前言

當一個已在運行的系統(有使用到資料庫),發生了些不可預期的問題。例如:資料損毀…等問題時。為了讓問題的傷害程度降低,我們可以從「如何進行資料庫備份」這件事情來進行思考。

在這篇文章中所使用到的開發環境是:

  • 作業系統: MacOS
  • 資料庫:MySQL

若作業系統是Ubuntu的讀者,請參考關於資料庫備份

那該如何進行資料庫備份呢?

一般來說有分手動備份及自動備份的方式。至於手動部分就不說明,而自動備份的方式就是寫腳本讓作業系統去幫我們自動備份。

設定自動備份的步驟分為:

  • 寫腳本檔案
  • 設定comd
  • 設定crontab
  • 重啟cron

1. 寫腳本檔案

首先,我們先建立sh(Shell scripts)的腳本檔案。

$ vi /Users/PenguinRun/BackupDB/mysqldump.sh

筆者在路徑:「/Users/PenguinRun/BackupDB」中建立了mysqldump.sh的腳本檔。之後在該.sh檔裡面輸入:

#backup the sql in user/backup/
mysqldump -utest -p123 member| gzip > /Users/PenguinRun/BackupDB/MySQL/mysqldb_`date +%F`.sql.gz

這段指令的意思是我們要將

  • user: test
  • password: 123
  • dbName: member

匯出成.sql檔案並壓縮成.gz檔來進行備份。

但這樣會讓系統不斷的備份下去,為了防止這種情況發生,我們還需要增加讓備份的檔案,在經過一段時間後能自動刪除的指令:

#三天前的資料自行刪除
find /Users/PenguinRun/BackupDB/MySQL -type f -mtime +3 -exec rm {} +

這段指令是讓路徑:「/Users/PenguinRun/BackupDB/MySQL」中的MySQL資料夾,如果裡面有檔案是於現在時間往前推算三天之前的檔案,就一併刪除。

若讀者對vi相關指令不熟,可參考鳥哥的 vi 文書處理軟體文章。

.sh檔案指令全貌

#backup the sql in user/backup/
mysqldump -utest -p1234 member | gzip > /Users/PenguinRun/BackupDB/MySQL/mysqldb_`date +%F`.sql.gz

#三天前的資料自行刪除
find /Users/PenguinRun/BackupDB/MySQL -type f -mtime +3 -exec rm {} +

2. 設定comd

修改.sh檔案的權限,讓該檔案可以被系統執行。而這邊所要進行的指令是$chmod +x <.sh path>。其中x的意思是:

  • x(execute):讓該檔案具有被系統執行的權限
$ chmod +x /Users/PenguinRun/BackupDB/mysqldump.sh

如果想要更深入了解.sh可以參考:鳥哥的 Linux 私房菜 -- 第十二章、學習 Shell Scripts

測試

在建立好.sh腳本檔且設定好權限後,我們來測試看看能不能運行。

$ cd <targetFolder> //移動到設定.sh檔案的資料夾
$ ./mysqldump.sh

正常完成後就可以在該目標資料夾底下看到.gz的備份檔案了。

3. 設定crontab

之後修改工程排程資料(crontab),讓系統去幫我們執行這個.sh檔的

$ crontab -e

在進入編輯畫面後,新增下列指令:

# Minute Hour Day of Month  Month  Day of Week  Command
# 分 時 日 月 週 指令
# * * * * * command
00 15* * * /Users/PenguinRun/BackupDB/mysqldump.sh

意思就是要在每天的下午三點執行一次sh檔中的指令,也就是備份資料庫。待輸入上述指令後,若是正常的情況會回覆:

crontab: installing new crontab

另外,我們也可以透過crontab -l指令,來檢查我們輸入的排程是否真的有進入運行的清單中。

$ crontab -l

# Minute Hour Day of Month  Month  Day of Week  Command
# 分 時 日 月 週 指令
# * * * * * command
00 00 * * * /Users/PenguinRun/BackupDB/mysqldump.sh

若正常,就會將整個我們剛剛所輸入的指令加進去。

例外問題

若讀者進到crontab -e且輸入完排程指令後所給的回覆是:

crontab: no crontab for PenguinRun - using an empty one
crontab: no changes made to crontab

可以參考Why I've got no crontab entry on OS X when using vim?的解法。

小結

經過上述的操作,讀者應該會覺得將資料庫從我們電腦中來達到自動化備份是件很有趣的事情吧?至少筆者是這樣覺得(笑)。會員系統部分已經告一段落,接續將進行實作「商品系統」的部分。

參考資料


上一篇
Node.js-Backend見聞錄(16):實作-會員系統(五)-添加部分功能
下一篇
# Node.js-Backend見聞錄(18):實作-商品系統(一)-設計概觀
系列文
Node JS-Back end見聞錄31

尚未有邦友留言

立即登入留言