公司租用了一台萬網雲主機,這是一台虛擬專用服務器,擁有獨立IP地址以及Linux系統root權限,使用雲計算技術以獲得更可靠的服務並降低成本。

服務器上運行着旗下2個網站,網站一邊運營一邊還在迭代開發增加新功能,所以需要定時備份網站和數據庫,萬一發生故障可以及時恢復。寫了幾個shell腳本來自動完成這項工作:

更新:隨着時間推移備份文件越來越多,在同一個目錄中難以組織管理。1.1版增加按年月創建目錄存放備份文件。

1、備份網站

#!/bin/sh
# File:    /home/backup_shell/backup_web.sh
# Author:  lovelucy
# Version: 1.1
 
# Some vars
BIN_DIR="/usr/bin"
BCK_DIR="/backup"
WEB_DIR="/var/www/html"
DATE=`date +%F`
DATE_YEAR=`date +%Y`
DATE_MONTH=`date +%m`
 
# Make Dir
if test -d $BCK_DIR/$DATE_YEAR/$DATE_MONTH
then
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH exists."
else
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH does not exists. make dir..."
    mkdir -p $BCK_DIR/$DATE_YEAR/$DATE_MONTH
fi
 
# Backup
tar -czf $BCK_DIR/$DATE_YEAR/$DATE_MONTH/web_$DATE.tar.gz  $WEB_DIR

2、備份數據庫

#!/bin/sh
# File:    /home/backup_shell/backup_db.sh
# Author:  lovelucy
# Version: 1.1
 
# Database info
DB_USER="root"
DB_PASS="db_password"
DB_NAME="db_name"
 
# Some vars
BIN_DIR="/usr/bin"
BCK_DIR="/backup"
DATE=`date +%F`
DATE_YEAR=`date +%Y`
DATE_MONTH=`date +%m`
 
# Make Dir
if test -d $BCK_DIR/$DATE_YEAR/$DATE_MONTH
then
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH exists."
else
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH does not exists. make dir..."
    mkdir -p $BCK_DIR/$DATE_YEAR/$DATE_MONTH
fi
 
# Backup
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BCK_DIR/$DATE_YEAR/$DATE_MONTH/${DB_NAME}_dump_$DATE.gz

3、備份網站日誌

#!/bin/sh
# File:    /home/backup_shell/backup_log.sh
# Author:  lovelucy
# Version: 1.1
 
# Some vars
BIN_DIR="/usr/bin"
BCK_DIR="/backup"
LOG_ERROR="/var/log/web-error_log"
LOG_ACCESS="/var/log/web-access_log"
DATE=`date +%F`
DATE_YEAR=`date +%Y`
DATE_MONTH=`date +%m`
 
# Make Dir
if test -d $BCK_DIR/$DATE_YEAR/$DATE_MONTH
then
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH exists."
else
    echo "directory $BCK_DIR/$DATE_YEAR/$DATE_MONTH does not exists. make dir..."
    mkdir -p $BCK_DIR/$DATE_YEAR/$DATE_MONTH
fi
 
# Backup
tar -czf $BCK_DIR/$DATE_YEAR/$DATE_MONTH/log_$DATE.tar.gz  $LOG_ERROR $LOG_ACCESS
 
# Clear logs
echo > $LOG_ERROR
echo > $LOG_ACCESS

4、設置cron定時執行

$ crontab -e

此時會啟動默認編輯器vim,添加以下內容

# backup log *daily*
59 3 * * * /home/backup_shell/backup_log.sh
# backup database *weekly*
1 4 * * 5 /home/backup_shell/backup_db.sh
# backup web files *monthly*
5 4 1 * * /home/backup_shell/backup_web.sh

保存後,默認會在/var/spool/cron目錄下生成一個以當前用戶名命名的文件。以上內容意義為:每一行由空格分割為6部分,依次為“分鐘”、“小時”、“日”、“月”、“星期”、“要執行的程序”。故上面的設置是

  • 每天3點59分執行backup_log.sh腳本
  • 每個星期5的4點1分執行backup_db.sh腳本
  • 每個月1號的4點5分執行backup_web.sh腳本

備份操作可能消耗大量資源和時間,應該設置在凌晨訪問量小、系統負載低的時候運行。如果有獨立的服務器存儲備份文件,還可以在腳本中增加ftp或者email傳送備份文件到遠程服務器的功能。

更新: 可以將備份文件同步到 Dropbox 中保存,查看操作方法