伺服器定時自動備份MySQL資料庫
阿新 • • 發佈:2018-12-25
本文記錄了伺服器資料庫備份、壓縮、加密、傳送記錄郵件的一套流程。
需求:伺服器的資料庫自動在增長,但是難保某個時候發生意外導致資料庫崩潰。所以需要做定時備份。
使用要點:利用MySQL中提供的mysqldump功能匯出資料庫,利用gzip進行壓縮,利用gpg進行對稱加密,最後使用PHP指令碼傳送記錄郵件。
1、sender.php
用於php編譯,傳送記錄郵件
PHP程式碼如下:
- <?php
- require_once("phpmailer/class.phpmailer.php");
-
$file = system("/backup/autobackup >> /backup/log"
- $mail = new PHPMailer();
- $mail->IsSMTP();
- $mail->Host = "smtp.163.com";
- $mail->SMTPAuth = true;
- $mail->Username = "這裡填上傳送郵箱使用者名稱";
- $mail->Password = "這裡填上傳送郵箱密碼";
- $mail->From = '填發件人@163.com';
-
$mail->FromName =
- $mail->CharSet = 'utf-8';
- $mail->Encoding = "base64";
- $mail->AddAddress("test","TEST");
- $mail->AddReplyTo('test',"TEST");
- $mail->WordWrap = 50;
- //$mail->AddAttachment($file); //這裡可以新增上備份檔案,但是為了安全不建議這麼做。
-
$mail->IsHTML(false);
- $date = date("Y-m-d", time());
- $mail->Subject = "BACKUP-DB".$date;
- $mail->Body = 'DB-BACKUP-'.$date.'CONTENT-IS-'.$file;
- $mail->AltBody ='text/html';
- $mail->Send();
- ?>
2、autobackup指令碼
用於備份-壓縮-加密
程式碼如下:
- filename=`date +%Y%m%d`
- echo "============================================"
- date
- /opt/mysql/bin/mysqldump 資料庫名 -u賬戶名 -p密碼 | gzip > /var/www/html/mysql\_backup/$filename.gz
- cd /var/www/html/mysql\_backup/
- encryptPasswd="加密密碼"
- echo ${encryptPasswd} | gpg --yes -c --passphrase-fd 0 $filename.gz > /var/www/html/mysql\_backup/$filename.gz.gpg
- rm $filename.gz
- find /var/www/html/mysql\_backup/ -mtime +20 -name "*.gz.gpg" -exec rm -rf {} \;
- echo /var/www/html/mysql\_backup/$filename.gz.gpg
- date
注意此處-u -p後面沒有空格。
此處兩個date輸出兩次時間以便記錄所耗費時間。加密完以後會刪除原有gz壓縮檔案。
find -exec命令用於刪除20天前的備份檔案,及時清空檔案防止伺服器硬碟耗費過大。
最後輸出備份檔案所在地址。
可以將檔案備份於FTP目錄,使得遠端異地備份得以實現。參見我另一篇文章:
3、設定定時
在redhat下面,輸入- crontab -u root -e
利用crontab實現定時,這行命令用vi開啟cron的配置檔案,修改後會自動重新整理,也可以執行
- /etc/rc.d/init.d/crond restart
進行重啟。
配置檔案修改方法如下:
- 0 20 * * * wget http://localhost/test
- 0 4 * * * php /backup/sender.php
效果是每天4:00進行備份 傳送記錄郵件。
參考http://www.chinaunix.net/old_jh/6/271992.html這篇文章,這邊摘取如下:- crontab -l -u [-e|-l|-r] 第一個命令列中,file是命令檔案的名字。如果在命令列中指定了這個檔案,那麼執行crontab命令,則將這個檔案拷貝到crontabs目錄下;如果在命令列中沒有制定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將他們也存放在crontab目錄下。
- 命令列中-r選項的作用是從/usr/spool/cron/crontabs目錄下刪除使用者定義的檔案crontab;
- 命令列中-l選項的作用是顯示使用者crontab檔案的內容。
- 使用命令crontab -u user -e命令編輯使用者user的cron(c)作業。使用者通過編輯檔案來增加或修改任何作業請求。
- 執行命令crontab -u user -r即可刪除當前使用者的所有的cron作業。
- 作業與它們預定的時間儲存在檔案/usr/spool/cron/crontabs/username裡。username使使用者名稱,在相應的檔案中存放著該使用者所要執行的命令。命令執行的結果,無論是標準輸出還是錯誤輸出,都將以郵件形式發給使用者。檔案裡的每一個請求必須包含以spaces和tabs分割的六個域。前五個欄位可以取整數值,指定何時開始工作,第六個域是字串,稱為命令欄位,其中包括了crontab排程執行的命令。
- 第一道第五個欄位的整數取值範圍及意義是:
- 0~59 表示分
- 1~23 表示小時
- 1~31 表示日
- 1~12 表示月份
- 0~6 表示星期(其中0表示星期日)
- /usr/lib/cron/cron.allow表示誰能使用crontab命令。如果它是一個空檔案表明沒有一個使用者能安排作業。如果這個檔案不存在,而有另外一個檔案/usr/lib/cron/cron.deny,則只有不包括在這個檔案中的使用者才可以使用crontab命令。如果它是一個空檔案表明任何使用者都可安排作業。兩個檔案同時存在時cron.allow優先,如果都不存在,只有超級使用者可以安排作業。