備份需求:每天完成一次指定文件的備份,壓縮后存放到指定目錄
問題:備份時間長了以后占用空間較大,浪費存儲,實際歷史備份意義不大,并不需要永久保存。但是如果直接刪除可能導致無法恢復歷史狀態的數據。
解決思路:
第一步:每天備份時用當天時間的日期的天數命名備份文件,每次備份時覆蓋上個月同一天的備份文件,這樣每天都有備份,最多留存31份備份,不會無限增加備份浪費空間。
第二步:考慮到歷史備份意義不大,但又不能完全刪除,所以每個月指定日期(例如每月01號)完成一次永久備份,一年備份量12份,占用較少空間,且可以恢復到N個月以前的狀態。
腳本下載:https://download.csdn.net/download/feng_601/88598945
功能:每天定時循環備份指定文件或文件夾,壓縮后存放到指定目錄,每天循環覆蓋上月的備份,最多保留31份,永久備份會單獨存放,每月01號永久備份一次
腳本文件名:backup_file.sh(可自定義)
使用方法:sh backup_file.sh [參數1] [參數2] [參數3]
## 參數1:允許空,要備份目標文件或文件夾
## 參數2:允許空,備份后存放位置目錄
## 參數3:允許空,默認值是01
#!/bin/bash
## 功能:定時循環備份指定文件或文件夾,壓縮后存放到指定目錄,每天循環覆蓋上月的備份,最多保留31份,永久備份會單獨存放,每月01號永久備份一次
## 腳本文件名:backup_file.sh
## 使用方法:sh backup_file.sh [參數1] [參數2] [參數3]
## 參數1:允許空,要備份目標文件或文件夾
## 參數2:允許空,備份后存放位置目錄
## 參數3:允許空,默認值是01
##
#################### 配置信息(可動態傳參,支持默認值) ##############################
# 需要備份的目標文件、或目標文件夾目錄
# 支持默認值,支持傳第1個參數
backupfile=${1:-"/data/folder"} #/data/test.txt
echo 需要備份的目標文件:$backupfile
#
# 配置文件及歸檔的目標目錄。
# 支持默認值,支持傳第2個參數
backup_dir=${2:-"/data/backup/mrdocpro"}
# 需要永久固定備份的日期,例如01 表示每月01號完成永久備份(不刪除不覆蓋)
# 支持默認值,支持傳第3個參數
forever_day=${3:-"01"} #默認值01
##################### 其他默認值配置 #################################################
#
# 備份后壓縮包名通過日期區分。
today=$(date +%Y%m%d)
# 獲得當天日期:比如01
day=$(date +%d)#按日備份存放目錄
backup_dir_day=$backup_dir/$day
#永久備份存放目錄
backup_dir_forever=$backup_dir/forever
#
echo 備份后歸檔存放路徑:$backup_dir_day
#日志文件
logdir=$backup_dir/logs
logfile=$logdir/$0_runlog.log
echo 日志文件:$logfile
#####################################################################################
#
#echo 備份路徑:$backup_dir_day
#################### 初始化 ##############################################
if [ ! -d "$logdir" ]; thenecho $(date +%Y-%m-%d-%T) "$logdir" 需要創建日志目錄:mkdir -p $logdirecho $(date +%Y-%m-%d-%T) "$logdir" 日志目錄已創建 created >> $logfile
fi
#如果文件夾不存在,創建文件夾
if [ ! -d "$backup_dir_day" ]; thenmkdir -p $backup_dir_dayecho $(date +%Y-%m-%d-%T) "$backup_dir_day" 文件夾已創建 createdecho $(date +%Y-%m-%d-%T) "$backup_dir_day" 文件夾已創建 created >> $logfile
fi
#
#####################################開始備份#######################################
###############每日備份,最多保留31份,一般保留30天的備份文件,循環覆蓋#############
#如果備份目標是文件夾
if [ -d "$backupfile" ]; thenbackedfilename=$backup_dir_day/${backupfile##*/}_${day}.tar.gz#壓縮文件,如果文件名已存在則直接覆蓋echo $(date +%Y-%m-%d-%T) 備份壓縮文件夾目錄 $backupfile 到 $backedfilenameecho $(date +%Y-%m-%d-%T) 備份壓縮文件夾目錄 $backupfile 到 $backedfilename >> $logfiletar -czf $backedfilename $backupfile 2>/dev/null
#如果備份目標是文件
elif [ -f "$backupfile" ]; thenbackedfilename=$backup_dir_day/${backupfile##*/}_${day}.tar.gzecho $(date +%Y-%m-%d-%T) 備份壓縮文件 $backupfile 到 $backedfilenameecho $(date +%Y-%m-%d-%T) 備份壓縮文件 $backupfile 到 $backedfilename >> $logfiletar -czf $backedfilename $backupfile 2>/dev/null
elseecho $(date +%Y-%m-%d-%T) 壓縮文件"$backupfile" 不存在或不受支持!!echo $(date +%Y-%m-%d-%T) 壓縮文件"$backupfile" 不存在或不受支持!! >> $logfile
fi
#壓縮文件,如果文件名已存在則直接覆蓋
#echo $(date +%Y-%m-%d-%T) 壓縮文件 $backupfile 到 $backedfilename
#echo $(date +%Y-%m-%d-%T) 壓縮文件 $backupfile 到 $backedfilename >> $logfile
#tar -czf $backedfilename $backupfile 2>/dev/null
#
###############每月永久備份,永久保留不會被覆蓋、不會刪除##########################
#如果是每月1號,則額外存放一份
if [ $day -eq ${forever_day} ] && [ -f "$backedfilename" ]; thenif [ ! -d "#$backup_dir_forever" ]; thenmkdir -p $backup_dir_foreverfi# 完成一次永久備份cp $backedfilename ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gzecho $(date +%Y-%m-%d-%T) 完成第一次永久備份copy復制 $backedfilename 到 ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gzecho $(date +%Y-%m-%d-%T) 完成第一次永久備份copy復制 $backedfilename 到 ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gz >> $logfile#backedfilename=$backup_dir_day/${backupfile##*/}_${today}.tar.gzecho $(date +%Y-%m-%d-%T) 完成第二次永久備份新建壓縮 $backupfile 到 $backedfilenameecho $(date +%Y-%m-%d-%T) 完成第二次永久備份新建壓縮 $backupfile 到 $backedfilename >> $logfiletar -czf $backedfilename $backupfile 2>/dev/nullfi
################################################################################
#刪除歷史文件(因為按名稱已經覆蓋,無需刪除)