MySQL數據庫定時備份Shell腳本

這是一個簡單的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定時執行腳本便可!

腳本以下:

[plain]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. #!/bin/bash  
  2. # description:  MySQL buckup shell script  
  3. # author:       Daniel  
  4. # web site:     http://home.ustc.edu.cn/~danewang/blog/  
  5.   
  6. st=$(date +%s)  
  7. USER="root"   
  8. PASSWORD="*****"#用戶名   
  9. DATABASE="myblogdb" #數據庫用戶密碼   
  10. MAIL="abcd@gmail.com"#mail     
  11. BACKUP_DIR=/home/daniel/data_backup/ #備份文件存儲路徑   
  12. LOGFILE=/home/daniel/data_backup/data_backup.log #日誌文件路徑  
  13.    
  14. DATE=`date +%Y%m%d-%H%M`#用日期格式做爲文件名  
  15. DUMPFILE=$DATE.sql   
  16. ARCHIVE=$DATE.sql.tar.gz   
  17. OPTIONS="-u$USER -p$PASSWORD $DATABASE"  
  18.   
  19. #判斷備份文件存儲目錄是否存在,不然建立該目錄   
  20. if [ ! -d $BACKUP_DIR ]   
  21. then  
  22.     mkdir -p "$BACKUP_DIR"  
  23. fi    
  24.   
  25. #開始備份以前,將備份信息頭寫入日記文件   
  26. echo "    ">> $LOGFILE   
  27. echo "--------------------" >> $LOGFILE   
  28. echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE   
  29. echo "-------------------" >> $LOGFILE    
  30.   
  31. #切換至備份目錄   
  32. cd $BACKUP_DIR   
  33. mysqldump $OPTIONS > $DUMPFILE   
  34. #判斷數據庫備份是否成功   
  35. if [[ $? == 0 ]]  
  36. then   
  37.     tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1   
  38.     echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE   
  39.     rm -f $DUMPFILE #刪除原始備份文件,只需保留備份壓縮包  
  40.     # 把壓縮包文件備份到其餘機器上。  
  41.     scp -P 1110 $BACKUP_DIR$ARCHIVE ubuntu@*.*.*.*:/home/user/data_backup/ >> $LOGFILE  2>&1  
  42.  else   
  43.     echo "Database Backup Fail!" >> $LOGFILE   
  44. #備份失敗後向管理者發送郵件提醒   
  45. mail -s "database:$DATABASE Daily Backup Fail!" $MAIL   
  46. fi   
  47. echo "Backup Process Done"   
  48. #刪除3天以上的備份文件  
  49. #Cleaning  
  50. 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中。

相關文章
相關標籤/搜索