设为首页 收藏本站
查看: 1066|回复: 0

完全备份数据和差异备份数据的shell脚本

[复制链接]

尚未签到

发表于 2018-8-20 10:50:58 | 显示全部楼层 |阅读模式
#!/bin/bash  
#
  
# Description: 该脚本功能,以周为单位循环;周五实行完全备份,周六不备份,周日至周四实行差异备份;
  
#              因工作需要,不实行压缩打包的方式,采用cp完全备份,rsync差异备份;
  
#              若要使用该脚本,请直接修改下面的两个参数:BackupPath和DATAPath,其他地方请不要修改;
  
# DATE: 2017-04-24 22:43:00
  
# MODIFY DATE: 2017-08-28 17:20:00
  
#     VERSION: 2.0
  
#      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/# 指定备份路径
  
MountPath=//ds-bk01/drv-y# 指定windwos备份服务器共享路径
  
DATAPath=/data/  # 需要备份的目录
  
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天前的备份目录
  
Mail_Group="test@aaa.com"    # 定义收件人
  
username=user    # 定义挂载备份服务器的用户名
  
password=password    # 定义挂载备份服务器的密码
  
# 记录日志文件的开头部分
  
Head() {
  
[ ! -d $LogDir ] && mkdir $LogDir
  
echo "[ 日文 ] このメッセ?ジはAB Linuxサ?バを介して、このメッセ?ジを介してs-smb01サ?バのデ?タバックアップを??するために送信されます。" > $LogFile
  
echo "[ 中文 ] 这封邮件是通过AB的linux服务器发出来的,通过这封邮件来确认s-smb01服务器的数据备份情况!" >> $LogFile 2>&1
  
echo  >> $LogFile 2>&1
  
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
  
}
  
# 日志的结束部分
  
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
  
}
  
# 完全备份
  
FullBackup(){
  
echo "Today is week: `date +%a`, Start performing a full backups..." >> $LogFile 2>&1
  
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..." >> $LogFile 2>&1
  
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
  
}
  
# 日志开始部分
  
Head
  
# 判断是否挂载//ds-bk01/drv-y,如果没有则挂载,如果挂载不成功则退出脚本,并记录至日志文件
  
mount | grep $MountPath >> $LogFile 2>&1
  
if [ $? -eq 0 ];then
  
        echo "[ $Host ] has successfully installed backup server shared directories: [ $MountPath ] to local: [ $BackupPath ] ... " >> $LogFile 2>&1
  
        echo  >> $LogFile 2>&1
  
else
  
        echo "[ $Host ] does not mount a backup server shared directory: [ $MountPath ] ..."  >> $LogFile 2>&1
  
        mount.cifs -o username=$username,password=$password,dir_mode=0777,file_mode=0777 $MountPath $BackupPath
  
        if [ $? -eq 0 ]; then
  
                echo "Mount successfully!" >> $LogFile 2>&1
  
        else
  
                echo "[ $Host ] failed to mount backup server shared directory: [ $MountPath ] to local: [ $BackupPath ] ..." >> $LogFile 2>&1
  
                echo "Mount again, please!" >> $LogFile 2>&1
  
                echo "The shell script has exited..." >> $LogFile 2>&1
  
end
  
                mail -s  "From [ $Host ] backup information [ $Time ]" $Mail_Group < $LogFile
  
                exit 8
  
        fi
  
fi
  
# 备份策略的变量
  
a=`date +%u`# 定义Today是星期几
  
b=7 # 定义多少天循环一次完全备份和差异备份,这里定义为7天循环一次,如果要增大循环天数,请修改此处
  
c=5# 这里5代表是周五完全备份,如果要改成周六完全备份,请修改为6,注意:c与d的值不能相同
  
d=6# 定义每周6不备份数据,注意:c与d的值不能相同
  
# 注意,下面的语句很重,判断Today是否大于$c,定义变量ago将采用不同的表达式计算
  
if [ "$a" -gt "$c" ]; then
  
  ago=$[ $a - $c ]# 定义Today离$c有多少天
  
else
  
  ago=$[ $a + $b - $c ]  # 定义Today离$c有多少天
  
fi
  
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
  
FullBackup
  
elif [ "$a" -eq "$d" ]; then
  
echo "Today is Saturday 6, according to the backup strategy, today no data backup." >> $LogFile 2>&1
  
else
  
DiffBackup
  
fi
  
# 日志结束部分
  
end
  
# 备份完成后发送邮件至指定邮箱
  
mail -s  "From [ $Host ] backup information [ $Time ]" $Mail_Group < $LogFile
  
exit 0



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554196-1-1.html 上篇帖子: 第八章 Shell标准输入、输出和错误 下篇帖子: shell学习之系统文件备份之脚本分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表