使用shell腳本備份文件實現異地備份並校驗文件(一)

整套需求,需要備份代碼機代碼並同步到異地備份服務器,最後備份服務器需要判斷備份文件是否正常,代碼機的數據是否和備份機的數據正常。

實現思路:
1.首先實現備份數據。
2.將數據同步到異地備份服務器。
3.文件校驗,可以使用md5來實現(將原數據的md5值同步到異地然後進行校驗)。

文件備份腳本如下:
執行腳本之前需要注意幾個事項,
1.異地備份服務器和本地代碼機需要安裝rsync服務
2.異地備份服務器需要配置rsync服務,一個備份數據存放目錄,一個是日誌文件存放目錄(日誌內有md5值,需要做校驗用。)
3.rsync的密碼文件權限必須爲600,要不會同步失敗

#!/bin/bash
#author: wys
#date: 20190410
#common: 備份服務器代碼文件
########################################
##備份命令: sh 腳本名稱+文件路徑+文件名稱###
########################################
set -e
source /etc/bashrc
#獲取本機ip地址(雲服務器需要手動配置IP地址,需要根據實際環境確認IP是否正確)
#IP=$(/sbin/ip addr |grep inet |grep -v inet6 |grep em1|awk '{print $2}' |awk -F "/" '{print $1}')
IP=x.x.x.x
work_dir=$1
file_name=$2
backup_dir=備份路徑
date=$(date "+%Y%m%d")  ##獲取系統時間

#判斷work_dir和file_name是否爲空:
if [[ ! -n "$work_dir" || ! -n "$file_name" ]] ;then
  echo "ERROR:work_dir或file_name參數爲空"
  echo "commd:sh file_backup.sh work_dir file_name;兩個參數都爲必填參數)"
  exit
else

#Log存放路徑
LogFile=$backup_dir/log/${IP}_${file_name}_${date}.log

if [ ! -d '$backup_dir/log' ]; then
    mkdir -p $backup_dir/log
fi
#新建日誌文件
touch $LogFile

#追加日誌到日誌文件
echo "start backup, start at  $(date +"%Y-%m-%d %H:%M:%S")" > $LogFile
echo "-------------------Start!---------------------------------" >> $LogFile

if [ ! -d '$backup_dir/$file_name' ]; then
    mkdir -p $backup_dir/$file_name
fi

#備份文件
echo "備份相關文件 $file_name" >> $LogFile
echo "tar czf ${backup_dir}/${file_name}/${file_name}_${date}.tar.gz --exclude=不需要備份的文件可以使用此參數過濾掉 -C $work_dir $file_name" >> $LogFile
tar czf ${backup_dir}/${file_name}/${file_name}_${date}.tar.gz -C $work_dir $file_name
if [ $? -eq 0 ];then  ##判斷命令是否執行即數據是否備份成功
  echo "Backup_Status="SUCCESS"" >> $LogFile
else
  echo "Backup_Status="FAILED"" >> $LogFile
fi
##查看備份文件大小
Bar_Size=`du -sh $backup_dir/$file_name/${file_name}_${date}.tar.gz |awk '{print $1}'`
##獲取備份文件的md5值
MD5=`/usr/bin/md5sum $backup_dir/$file_name/${file_name}_${date}.tar.gz | awk '{print $1}'`
echo "備份文件路徑:$backup_dir/$file_name/${file_name}_${date}.tar.gz" >> $LogFile
echo "文件大小:${Bar_Size}">> $LogFile
echo "MD5: $MD5" >> $LogFile
echo "-----------------------------------------------------" >> $LogFile

###備份文件需要定時清理,要不會導致磁盤爆滿。
###備份數據保留5天(保留時間可根據需求自行修改)
find $backup_dir/$file_name/ -mtime +5 -name "*.tar.gz" -exec rm -rf {} \;
###日誌文件保存3天(保留時間可根據需求自行修改)
find $backup_dir/log -mtime +3 -name "*.log" -exec rm -rf {} \;

#備份完成追加日誌到日誌文件
    echo "-----------------------------------Complete!----------------------------------------" >> $LogFile
    echo "backup end, end at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

##同步備份文件到備份服務器
echo "start rsync,$(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
rsync -rauvt --progress --password-file=/data/scripts/backup.pass --bwlimit=500 $backup_dir/$file_name/${file_name}_${date}.tar.gz backup@異地備份服務器的ip::backup/$IP/$file_name/
if [ $? -eq 0 ];then
  echo "Rsync_Status="SUCCESS"" >> $LogFile
  echo "rsync end,$(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile
else
  echo "Rsync_Status="FAILED"" >> $LogFile
  echo "rsync end,$(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile
fi
##拷貝日誌文件到遠程服務器
rsync -rauvt --progress --password-file=/data/scripts/backup.pass $LogFile backup@異地備份服務器的ip::logs
fi

執行命令如需要備份/data/www下的code目錄:
sh back_files.sh /data/www code
切記腳本運行前需要測試是否正常運行,要不導致數據備份失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章