1. 程式人生 > >shell 練習(07)——MySQL 資料庫備份

shell 練習(07)——MySQL 資料庫備份

1. 題目

設計一個 shell 指令碼來備份資料庫,首先在本地伺服器上儲存一份資料,然後再遠端拷貝一份,本地儲存一週的資料,遠端儲存一個月。

假定,我們已經知道了 mysql root 賬戶密碼,要備份的資料庫為 wenming ,本地備份目錄為 /data/backup/mysql,遠端伺服器 ip 為 192.168.12.34 ,遠端提供了一個 rsync 服務,備份的地址是 192.168,12.34::backup . 寫完指令碼後,需要加入到cron 中,每天凌晨 3 點執行。

2. 習題分析

  1. 首先要會寫 mysql 資料庫的備份命令,會寫命令列,就把它直接寫到腳本里;
  2. 因為涉及到遠端和本地伺服器的備份,所以會用到 rsync 命令,還要懂得用這個命令在本地和遠端伺服器之間傳輸檔案;
  3. 最後一個要求是,備份檔案的過期時間,所以要實現時間判斷,並刪除的功能;通常使用的方法是 find 命令,判斷檔案時間,再刪除。但是 find 命令對於遠端伺服器就比較難實現了。這裡建議使用 data +%w 和 data +%d 命令,分別表示周幾和幾號。

3. 指令碼

#!/bin/bash
### backup mysql

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/mysql/bin

d1=`date +%w`
d2=`data +%d`

pass="your_mysql_password"
backupdir=/data/backup/mysql
r_backupdir=192.168.12.34::backup

exec 1>/your/mysql/log/path.log  2>/your/mysql/log/path.log
echo "mysql backup begin at date `date +"%F %T"`"
mysqldump  -uroot -p${pass} wenming > ${backupdir}/${d1}.sql
rsync  -az ${backupdir}/${d1}.sql $r_backupdir/${d2}.sql

echo "mysql backup end at `date +"%F %T"`"

4. 解析

  1. 設定 PATH 的原因,是可能我們在後面使用的 mysqldump 命令並不在 PATH 路徑。或者,你可以使用 mysqldump 的全路徑。
  2. 變數 d1 為當天是周幾,變數 d2 為當天是這個月的幾號。周的取值範圍是 0-6,月的是1-31。本地存一週,就用 d1 取值,無論怎麼迴圈都只有 0-6 個檔案。遠端用 d2 取值,存一個月,無論怎麼迴圈都只有1-31個檔案。
  3. 定義 exec 1>/your/mysql/log/path.log 2>/your/mysql/log/path.log ,表示對輸出和錯誤輸出進行重定向,在下面的命令的所有正確和錯誤的輸出內容都儲存在 /your/mysql/log/path.log 日誌。
  4. mysqldump 就是 mysql 資料庫用來備份的命令,不多解釋了。
  5. rsync 就是遠端同步,遠端傳輸複製檔案的一個命令,選項 -z 表示在傳輸的過程會對檔案進行壓縮處理。