2013年1月13日

使用 mysqldump, crontab, s3cmd 自動化異地備份資料庫到 Amazon S3 雲端儲存

過去 Linux 系統的維護,對於重要的資料庫備份,不外乎是增加本地備份用的硬碟、網路儲存系統(NAS),最麻煩且成本最高的是異地備份。在雲端儲存大行其道的時代,Amazon S3 也成為系統管理者備份資料的好工具。

目前有許多新的 NAS 產品,也提供同步備份到 Amazon S3 的服務;因為操作較簡單適合一般使用者,請自行尋找合適的 NAS 解決方案(參考)。

這篇文章是利用 Shell Script 的方式,自動將 MySQL 資料庫備份到 Amazon S3,適合自行架設或租用 VPS Linux 主機的系統管理者。

測試環境為 Ubuntu Linux 12.04 LTS

### 測試 mysqldump 指令 ###

建立一組備份資料用的 MySQL 帳號 USER 並設定為 NO PASSWORD、只限從 localhost (主機)連線。

將 DB_NAME 資料庫備份到 DB_NAME.sql 的指令:

    mysqldump -u USER DB_NAME > DB_NAME.sql

如果執行成功(使用者權限正確),DB_NAME.sql 會包含資料庫完整 structure 與 data。

### 使用 gzip 壓縮備份檔 ###

先確認 gzip 工具已安裝。

    sudo apt-get install gzip

壓縮檔案。

    gzip DB_NAME.sql

執行完成後會產生 DB_NAME.sql.gz(並移除 DB_NAME.sql)。

### 加上日期標記 ####

為了區分不同時間點的備份檔,使用 date 指令產生日期。

    date +%Y%m%d%H%M%S

這個指令會產生日期+時間的一串文字:20130113132718。

為了重複利用,以 Shell 變數儲存日期標記。

    set stamp=`date +%Y%m%d%H%M%S`; echo $stamp

### 結合以上操作 ###

將備份、壓縮變成一行指令。

    stamp=`date +%Y%m%d%H%M%S`; mysqldump DB_NAME > /tmp/DB_NAME-$stamp.sql && gzip /tmp/DB_NAME-$stamp.sql

### 使用 s3cmd 備份檔案 ###

先開通 Amazon AWS 的帳號及 S3 服務,取得 ACCESS_KEY 與 SECRET_KEY。

安裝 s3cmd 工具。

    sudo apt-get install s3cmd

先設定 S3 存取權限(access_key, secret_key)。

    s3cmd --configure

先建立 Bucket(S3 儲存空間)。

    s3cmd mb s3://BUCKET_NAME

通常 Bucket 名稱使用自訂的網域,例如(s3.company.com)。

上傳一的檔案。

    s3cmd put DB_NAME.sql.gz s3://BUCKET_NAME/backup

瀏覽 S3 的檔案。

    s3cmd ls s3://BUCKET_NAME/backup/

取回檔案。

    s3cmd get s3://BUCKET_NAME/backup/DB_NAME.sql.gz DB_NAME.sql.gz

### 組合成備份指令 ###

先測試指令是否正確運作。

    stamp=`date +%Y%m%d%H%M%S`; mysqldump DB_NAME > /tmp/DB_NAME-$stamp.sql && gzip /tmp/DB_NAME-$stamp.sql && s3cmd put /tmp/DB_NAME-$stamp.sql.gz s3://BUCKET_NAME/backup/

檢查檔案備份結果。

    s3cmd ls s3://BUCKET_NAME/backup/

將指令存為 Script (backup.sh)檔。

--------- /home/USER1/backup.sh ---------
#!/bin/bash
stamp=`date +%Y%m%d%H%M%S`; mysqldump DB_NAME > /tmp/DB_NAME-$stamp.sql && gzip /tmp/DB_NAME-$stamp.sql && s3cmd --no-progress put /tmp/DB_NAME-$stamp.sql.gz s3://BUCKET_NAME/backup/
--------------------- END ----------------------

設定執行權限。

    chmod a+x backup.sh

先執行一次測試備份程式。

    ./backup.sh

### 設定 crontab 工作排程 ###

定時執行 backup.sh 程式,使用 crontab 即可辦到。

修改 crontab 設定(使用個人喜歡的編輯器)。

    crontab -e

在最行一行加入:

0 3 * * * /home/USER1/backup.sh > /dev/null 2>&1

固定每日凌晨三點,自動執行資料庫備份程式(後面 redirect 到 /dev/null 是為了避免 crontab 將訊息以郵件通知)。

@作者 lyhcode 是熱血程式設計師,喜歡分享 Linux 作業系統與自由軟體的使用技巧,本文歡迎轉載請註明出處。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!