1. 程式人生 > >伺服器定時自動備份MySQL資料庫

伺服器定時自動備份MySQL資料庫

本文記錄了伺服器資料庫備份、壓縮、加密、傳送記錄郵件的一套流程。

需求:伺服器的資料庫自動在增長,但是難保某個時候發生意外導致資料庫崩潰。所以需要做定時備份。

使用要點:利用MySQL中提供的mysqldump功能匯出資料庫,利用gzip進行壓縮,利用gpg進行對稱加密,最後使用PHP指令碼傳送記錄郵件。

1、sender.php

用於php編譯,傳送記錄郵件

PHP程式碼如下:

  1. <?php  
  2.         require_once("phpmailer/class.phpmailer.php");  
  3.         $file = system("/backup/autobackup >> /backup/log"
    );  
  4.         $mail = new PHPMailer();  
  5.         $mail->IsSMTP();  
  6.         $mail->Host = "smtp.163.com";  
  7.         $mail->SMTPAuth = true;  
  8.         $mail->Username = "這裡填上傳送郵箱使用者名稱";  
  9.         $mail->Password = "這裡填上傳送郵箱密碼";  
  10.         $mail->From = '填發件人@163.com';  
  11.         $mail->FromName = 
    '填自己的名字';  
  12.         $mail->CharSet = 'utf-8';  
  13.         $mail->Encoding = "base64";  
  14.         $mail->AddAddress("test","TEST");  
  15.         $mail->AddReplyTo('test',"TEST");  
  16.         $mail->WordWrap = 50;  
  17.         //$mail->AddAttachment($file); //這裡可以新增上備份檔案,但是為了安全不建議這麼做。
  18.         $mail->IsHTML(false);  
  19.         $date = date("Y-m-d", time());  
  20.         $mail->Subject = "BACKUP-DB".$date;  
  21.         $mail->Body = 'DB-BACKUP-'.$date.'CONTENT-IS-'.$file;  
  22.         $mail->AltBody ='text/html';  
  23.         $mail->Send();  
  24. ?>  


2、autobackup指令碼

用於備份-壓縮-加密

程式碼如下:

  1. filename=`date +%Y%m%d`  
  2. echo "============================================"  
  3. date  
  4. /opt/mysql/bin/mysqldump 資料庫名 -u賬戶名 -p密碼 | gzip > /var/www/html/mysql\_backup/$filename.gz  
  5. cd /var/www/html/mysql\_backup/  
  6. encryptPasswd="加密密碼"  
  7. echo ${encryptPasswd} | gpg --yes -c --passphrase-fd 0 $filename.gz > /var/www/html/mysql\_backup/$filename.gz.gpg  
  8. rm $filename.gz  
  9. find /var/www/html/mysql\_backup/ -mtime +20 -name "*.gz.gpg" -exec rm -rf {} \;  
  10. echo /var/www/html/mysql\_backup/$filename.gz.gpg  
  11. date  

注意此處-u  -p後面沒有空格。

此處兩個date輸出兩次時間以便記錄所耗費時間。

加密完以後會刪除原有gz壓縮檔案。

find -exec命令用於刪除20天前的備份檔案,及時清空檔案防止伺服器硬碟耗費過大。

最後輸出備份檔案所在地址。

可以將檔案備份於FTP目錄,使得遠端異地備份得以實現。參見我另一篇文章:

3、設定定時

在redhat下面,輸入
  1. crontab -u root -e  

利用crontab實現定時,這行命令用vi開啟cron的配置檔案,修改後會自動重新整理,也可以執行
  1. /etc/rc.d/init.d/crond restart  

進行重啟。

配置檔案修改方法如下:

  1. 0 20 * * * wget http://localhost/test  
  2. 0 4  * * * php /backup/sender.php  

效果是每天4:00進行備份 傳送記錄郵件。

參考http://www.chinaunix.net/old_jh/6/271992.html這篇文章,這邊摘取如下:
  1. crontab -l -u [-e|-l|-r] 第一個命令列中,file是命令檔案的名字。如果在命令列中指定了這個檔案,那麼執行crontab命令,則將這個檔案拷貝到crontabs目錄下;如果在命令列中沒有制定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將他們也存放在crontab目錄下。   
  2. 命令列中-r選項的作用是從/usr/spool/cron/crontabs目錄下刪除使用者定義的檔案crontab;   
  3. 命令列中-l選項的作用是顯示使用者crontab檔案的內容。   
  4. 使用命令crontab -u user -e命令編輯使用者user的cron(c)作業。使用者通過編輯檔案來增加或修改任何作業請求。   
  5. 執行命令crontab -u user -r即可刪除當前使用者的所有的cron作業。   
  6. 作業與它們預定的時間儲存在檔案/usr/spool/cron/crontabs/username裡。username使使用者名稱,在相應的檔案中存放著該使用者所要執行的命令。命令執行的結果,無論是標準輸出還是錯誤輸出,都將以郵件形式發給使用者。檔案裡的每一個請求必須包含以spaces和tabs分割的六個域。前五個欄位可以取整數值,指定何時開始工作,第六個域是字串,稱為命令欄位,其中包括了crontab排程執行的命令。   
  7. 第一道第五個欄位的整數取值範圍及意義是:   
  8. 0~59 表示分   
  9. 1~23 表示小時   
  10. 1~31 表示日   
  11. 1~12 表示月份   
  12. 0~6 表示星期(其中0表示星期日)   
  13. /usr/lib/cron/cron.allow表示誰能使用crontab命令。如果它是一個空檔案表明沒有一個使用者能安排作業。如果這個檔案不存在,而有另外一個檔案/usr/lib/cron/cron.deny,則只有不包括在這個檔案中的使用者才可以使用crontab命令。如果它是一個空檔案表明任何使用者都可安排作業。兩個檔案同時存在時cron.allow優先,如果都不存在,只有超級使用者可以安排作業。