shell 練習(07)——MySQL 資料庫備份
阿新 • • 發佈:2018-12-03
1. 題目
設計一個 shell 指令碼來備份資料庫,首先在本地伺服器上儲存一份資料,然後再遠端拷貝一份,本地儲存一週的資料,遠端儲存一個月。
假定,我們已經知道了 mysql root 賬戶密碼,要備份的資料庫為 wenming ,本地備份目錄為 /data/backup/mysql,遠端伺服器 ip 為 192.168.12.34 ,遠端提供了一個 rsync 服務,備份的地址是 192.168,12.34::backup . 寫完指令碼後,需要加入到cron 中,每天凌晨 3 點執行。
2. 習題分析
- 首先要會寫 mysql 資料庫的備份命令,會寫命令列,就把它直接寫到腳本里;
- 因為涉及到遠端和本地伺服器的備份,所以會用到 rsync 命令,還要懂得用這個命令在本地和遠端伺服器之間傳輸檔案;
- 最後一個要求是,備份檔案的過期時間,所以要實現時間判斷,並刪除的功能;通常使用的方法是 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. 解析
- 設定 PATH 的原因,是可能我們在後面使用的 mysqldump 命令並不在 PATH 路徑。或者,你可以使用 mysqldump 的全路徑。
- 變數 d1 為當天是周幾,變數 d2 為當天是這個月的幾號。周的取值範圍是 0-6,月的是1-31。本地存一週,就用 d1 取值,無論怎麼迴圈都只有 0-6 個檔案。遠端用 d2 取值,存一個月,無論怎麼迴圈都只有1-31個檔案。
- 定義 exec 1>/your/mysql/log/path.log 2>/your/mysql/log/path.log ,表示對輸出和錯誤輸出進行重定向,在下面的命令的所有正確和錯誤的輸出內容都儲存在 /your/mysql/log/path.log 日誌。
- mysqldump 就是 mysql 資料庫用來備份的命令,不多解釋了。
- rsync 就是遠端同步,遠端傳輸複製檔案的一個命令,選項 -z 表示在傳輸的過程會對檔案進行壓縮處理。