這是一個簡單的MySQL數據庫備份shell腳本,適用於單臺Linux服務器或者VPS的mysql數據庫備份工做, html
工做原理是使用mysql的mysqldump工具來導出數據庫爲.sql文件,而後將全部導出的文件打包歸檔。 mysql
而後咱們在shell腳本中使用 scp命令把備份文件複製到另一臺備份機器,因爲scp每次傳送文件要密碼 web
所以咱們須要使用 expect插件或者利用密鑰。在這裏介紹採用生成密鑰對的方法。 sql
1,生成密匙對,我用的是rsa的密鑰。使用命令 "ssh-keygen -t rsa" shell
生成的過程當中提示輸入密鑰對保存位置及密碼,直接回車,接受默認值就好了。 數據庫
其中公共密鑰保存在 ~/.ssh/id_rsa.pub,私有密鑰保存在 ~/.ssh/id_rsa 。 ubuntu
2,而後修改 .ssh 目錄權限,chmod 755 ~/.ssh 。最後把 公共密鑰複製到你要訪問 vim
的機器上去,並保存爲:~/.ssh/authorized_keys 。 bash
scp -P 1110 ~/.ssh/id_rsa.pub daniel@*.*.*.*:/home/daniel/.ssh/authorized_keys 服務器
(注意這裏- P 爲大寫, 表示目標機器daniel 的ssh端口爲1110,小寫的p爲源ssh端口,
修改ssh端口在文件/etc/ssh/sshd_config下 。)這裏完成scp 腳本免密鑰的方法介紹。
最後使用crontab定時執行腳本便可!
腳本以下:
- #!/bin/bash
- # description: MySQL buckup shell script
- # author: Daniel
- # web site: http://home.ustc.edu.cn/~danewang/blog/
-
- st=$(date +%s)
- USER="root"
- PASSWORD="*****"#用戶名
- DATABASE="myblogdb" #數據庫用戶密碼
- MAIL="abcd@gmail.com"#mail
- BACKUP_DIR=/home/daniel/data_backup/ #備份文件存儲路徑
- LOGFILE=/home/daniel/data_backup/data_backup.log #日誌文件路徑
-
- DATE=`date +%Y%m%d-%H%M`#用日期格式做爲文件名
- DUMPFILE=$DATE.sql
- ARCHIVE=$DATE.sql.tar.gz
- OPTIONS="-u$USER -p$PASSWORD $DATABASE"
-
- #判斷備份文件存儲目錄是否存在,不然建立該目錄
- if [ ! -d $BACKUP_DIR ]
- then
- mkdir -p "$BACKUP_DIR"
- fi
-
- #開始備份以前,將備份信息頭寫入日記文件
- echo " ">> $LOGFILE
- echo "--------------------" >> $LOGFILE
- echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE
- echo "-------------------" >> $LOGFILE
-
- #切換至備份目錄
- cd $BACKUP_DIR
- mysqldump $OPTIONS > $DUMPFILE
- #判斷數據庫備份是否成功
- if [[ $? == 0 ]]
- then
- tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
- echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE
- rm -f $DUMPFILE #刪除原始備份文件,只需保留備份壓縮包
- # 把壓縮包文件備份到其餘機器上。
- scp -P 1110 $BACKUP_DIR$ARCHIVE ubuntu@*.*.*.*:/home/user/data_backup/ >> $LOGFILE 2>&1
- else
- echo "Database Backup Fail!" >> $LOGFILE
- #備份失敗後向管理者發送郵件提醒
- mail -s "database:$DATABASE Daily Backup Fail!" $MAIL
- fi
- echo "Backup Process Done"
- #刪除3天以上的備份文件
- #Cleaning
- find $BACKUP_DIR -type f -mtime +2 -name "*.tar.gz" -exec rm -f {} \;
修改/etc/crontab
#vi /etc/crontab
在下面添加:
00 02 * * * user /data/backup/dump.sh # user 爲當前系統的用戶
注意/data/backup/dump.sh爲腳本的存放位置.
表示天天2點鐘執行備份。
從新啓動crond
# /etc/rc.d/init.d/crond restart
當scp備份到其餘機器出現問題時 查看/var/log下的cron日誌,/若是var/log下沒有cron日誌,
則須要:修改rsyslog,命令:sudo vim /etc/rsyslog.d/50-default.conf ,cron.* /var/log/cron.log
#將cron前面的註釋符去掉 ,重啓rsyslog ,命令:sudo service rsyslog restart,能夠查看crontab
日誌。
less /var/log/cron.log , crontab問題定位。
注意命令,格式:command > file 2>&1
2>&1 是將錯誤輸出重定向到標準輸出。 而後將標準輸入重定向到文件file。&1 表示的是文件描述1,
表示標準輸出,若是這裏少了&就成了數字1,就表示重定向到文件1。
這句命令的意思:首先是command > file將標準輸出重定向到file中, 2>&1 是標準錯誤拷貝了標準
輸出,也就是一樣被重定向到file中,最終結果就是標準輸出和錯誤都被重定向到file中。