1. 程式人生 > >完全備份數據和差異備份數據的shell腳本

完全備份數據和差異備份數據的shell腳本

完全備份數據和差異備份數據的shell腳本

#!/bin/bash 
#
# Description: 該腳本功能,以周為單位循環;周五實行完全備份,周六不備份,周日至周四實行差異備份;
#              因工作需要,不實行壓縮打包的方式,采用cp完全備份,rsync差異備份;
#              若要使用該腳本,請直接修改下面的兩個參數:BackupPath和DATAPath,其他地方請不要修改;
#	 DATE: 2017-04-24 22:43:00
# MODIFY DATE: 2017-04-28 10:00:00  
#     VERSION: 1.1
#      Author: xixi_chan

# 導入PATH環境變量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/sbin:/root/bin

# 重新定義IFS變量避免目錄或文件名存在空格時被分割
IFS=`echo -en "\n\b"`

# 定義全局變量
BackupPath=/mnt/backup_data/				# 指定備份路徑 
DATAPath=/data/ac-cnc/  			# 需要備份的目錄  
Time=`date +%Y-%m-%d`					# 定義Today的時間變量	
Host=`echo $HOSTNAME | awk -F‘.‘ ‘{print $1}‘`		# 定義主機名
LogFile="/var/log/${Host}/${Host}_${Time}.log"  	# 定義日誌文件名稱
LogDir=`echo "$LogFile" | sed -r ‘s@[^/]+/?$@@g‘`	# 定義日誌文件所在的目錄
DirFile=`ls $DATAPath`					# 將備份路徑下的文件及目錄保存至變量DirFile中	
FirstFile="${BackupPath}${Host}_${Time}/`basename ${DATAPath}`/"  		# 根據時間定義當前備份的目錄
OldFirstFile="${BackupPath}${Host}_$(date +%Y-%m-%d --date=‘7 days ago‘)"	# 定義7天前的備份目錄

# 記錄日誌文件的開頭部分
Head() {
[ ! -d $LogDir ] && mkdir $LogDir
echo "---------------------The backup starts----------------------" > $LogFile 
echo  >> $LogFile 2>&1
echo "Start Backup $DATAPath		 $(date +"%y-%m-%d %H:%M:%S")"  >> $LogFile 2>&1 
echo  >> $LogFile 2>&1
echo "---------------------The backup starts----------------------"  >> $LogFile 2>&1 
echo  >> $LogFile 2>&1
echo  >> $LogFile 2>&1
}

# 完全備份
FullBackup(){
echo "Today is week: `date +%a`, Start performing a full backups..."
echo  >> $LogFile 2>&1
echo  >> $LogFile 2>&1

if [ -d $OldFirstFile ];then     
	rm -rf $OldFirstFile  >> $LogFile 2>&1      
	echo "[ $OldFirstFile ] Delete Old File Success!	`date`"  >> $LogFile 2>&1
	[ ! -d $FirstFile ] && mkdir -pv $FirstFile   >> $LogFile 2>&1
	cd $DATAPath
	for File in $DirFile; do
		cp -a ${File}  $FirstFile  >> $LogFile 2>&1
		if [ $? -eq 0 ];then
			echo "[ ${DATAPath}${File} ] Backup Success!	`date`"  >> $LogFile 2>&1 
		fi
	done
else
	if [ ! -d $FirstFile ];then
		mkdir -pv $FirstFile  >> $LogFile 2>&1 
		cd $DATAPath
		for File in $DirFile; do
			cp -a ${File}  $FirstFile  >> $LogFile 2>&1 
			if [ $? -eq 0 ];then
				echo "[ ${DATAPath}${File} ] Backup Success!	`date`"  >> $LogFile 2>&1 
			fi
		done
	else
		echo "[ $DATAPath ]The Backup File is exists,Can‘t Backup!	`date`"  >> $LogFile 2>&1 
	fi
	
fi   
}

# 差異備份
DiffBackup() {
echo "Today is week: `date +%a`, Start performing differential backups..."
echo  >> $LogFile 2>&1
echo  >> $LogFile 2>&1

if [ -d $OldFirstFile ];then
        rm -rf $OldFirstFile  >> $LogFile 2>&1
        echo "[ $OldFirstFile ] Delete Old File Success!        `date`"  >> $LogFile 2>&1
        [ ! -d $FirstFile ] && mkdir -pv $FirstFile   >> $LogFile 2>&1
        rsync --dry-run -racnC --out-format="%n"  $DATAPath $d_dir | grep -v "/$" | xargs -I{} rsync -R -a -z ${DATAPath}/./{} $FirstFile
	if [ $? -eq 0 ];then
		echo "[ ${DATAPath}${File} ] Backup Success!	`date`"  >> $LogFile 2>&1 
	fi
else
        if [ ! -d $FirstFile ];then
               mkdir -pv $FirstFile  >> $LogFile 2>&1
               rsync --dry-run -racnC --out-format="%n"  $DATAPath $d_dir | grep -v "/$" | xargs -I{} rsync -R -a -z ${DATAPath}/./{} $FirstFile
    		    if [ $? -eq 0 ];then
    			   echo "[ ${DATAPath}${File} ] Backup Success!	`date`"  >> $LogFile 2>&1 
    		    fi
        else
                echo "[ ${DATAPath} ]The Backup File is exists,Can‘t Backup!      `date`"  >> $LogFile 2>&1
        fi

fi
}

# 日誌的結束部分
end(){
echo  >> $LogFile 2>&1
echo  >> $LogFile 2>&1
echo "---------------------The backup ends ----------------------"  >> $LogFile 2>&1 
echo  >> $LogFile 2>&1
echo " $DATAPath backup ends            $(date +"%y-%m-%d %H:%M:%S")"  >> $LogFile 2>&1
echo  >> $LogFile 2>&1
echo "---------------------The backup ends ----------------------"  >> $LogFile 2>&1 
}

a=`date +%u`	# 定義Today是星期幾
b=7 		# 定義多少天循環一次完全備份和差異備份,這裏定義為7點循環一次,如果要增大循環天數,請修改此處
c=5		# 這裏5代表是周五完全備份,如果要改成周六完全備份,請修改為6
d=6		# 定義每周6不備份數據
ago=$[ $a + $b -$c ]	# 定義Today離$c有多少天
d_dir=${BackupPath}${Host}_$(date +%Y-%m-%d -d "`echo $ago` days ago")/`basename ${DATAPath}`/
#date +%Y-%m-%d -d "`echo $ago` days ago" 

# 定義備份策略
if [ "$a" -eq "$c" ]; then
	Head
	FullBackup
	end
elif [ "$a" -eq "$d" ]; then
	Head
	echo "Today is Saturday 6, according to the backup strategy, today no data backup." >> $LogFile 2>&1
	end
else
	Head
	DiffBackup
	end
fi

# 備份完成後發送郵件至指定郵箱
Mail_Group="[email protected]
/* */ [email protected]" mail -s "From $Host backup information" $Mail_Group < $LogFile exit 0


本文出自 “ccschan” 博客,轉載請與作者聯系!

完全備份數據和差異備份數據的shell腳本