Linux 利用rsync實現全自動增量&&全量備份配置


前情提要:

  項目馬上要上線之際,某摸魚小伙正在和妹子Q在線斗圖,突然一只厚重的手搭上了小伙的肩膀,小伙一個機靈,回頭看見領導在后面凝視!~

  領導:有空嗎?

  小伙:嗯...(OS:他看到了什么?),有空吧~

  領導:好像線上的數據庫還沒有做備份,你現在有空,就把這個備份做了吧。

  然后通過溝通,小伙確定了備份方案:要保留最近的三個備份,每天增量備份一次,每周全量備份一次

話不多說了,開始干活!

  ps:本次備份只演示在本機上進行備份,需要跨服務器備份的同學可以參考“rsync跨服務器文件同步”相關資料,結合本配置教程完成自動化的操作。

  工具:數據鏡像備份工具 rsync + shell腳本 + 定時任務命令 crontab

  本次備份的目標為docker容器中的數據庫掛載目錄和數據庫的docker-compose文件,只需要將包含這兩塊的整個文件夾備份就可以了。

 

1.shell備份腳本

#!/bin/bash

# 打印腳本開始執行時間
echo `date +"%Y/%m/%d-%H:%M:%S"`

echo "-------Start!--------"

# 獲取當前是周幾
WEEK_DAY=$(date +%w)
echo '今天星期'$WEEK_DAY

# 判斷是否是周日,0就代表周日
if [ $WEEK_DAY -eq 0 ];then
  # 如果是周日,就全量更新,所謂全量備份就是把之前增量備份的文件夾名字換掉
  echo "今天是周天,全量備份數據庫"
  # 舊的備份目錄名稱拼接上時間
  filename=pgback_$(date +%Y%m%d)
  # 修改舊的備份目錄名稱為filename
  mv /mnt/data/docker/pgback/postgis /mnt/data/docker/pgback/$filename
else
  echo "今天不是周天,增量備份數據庫"
fi


#--------開始增量備份(/mnt/data/docker/pgback下沒有postgis文件夾話就是全量了)---------

# 語法 rsync -avzP --delete 數據庫所在目錄 備份所在目錄
# 其中 -avzp 和 --delete 的解釋如下:
# -a: 歸檔模式,表示遞歸傳輸並保持文件屬性
# -v:顯示rsync過程中詳細信息
# -z: 傳輸時進行壓縮提高效率
# -P:顯示文件傳輸的進度信息
# --delete:當源目錄中的文件刪除,同步后目標目錄中的文件也會被刪除
rsync -avzP --delete /mnt/data/docker/postgis /mnt/data/docker/pgback

#--------控制備份個數-------------------------------------------------------------

# 保留文件數,包含文件夾
ReservedNum=3
# 文件所在的上級目錄,以下就叫父目錄吧
FileDir=/mnt/data/docker/pgback
# 獲取父目錄中文件的數量
FileNum=$(ls -l $FileDir |sed 1d|wc -l)
# 當文件數量不再大於保留文件數時,結束循環
while (($FileNum > $ReservedNum)); do
  # 獲取創建時間最早的文件名稱
  OldFile=$(ls -rt $FileDir | head -1)
  # 打印刪除文件的信息,日志中可以看
  echo $(date +"%Y/%m/%d-%H:%M:%S") "Delete File:"$OldFile
  # 執行刪除
  rm -rf $FileDir/$OldFile
  # 文件數量減1,繼續循環判斷
  let "FileNum--"
done

#--------控制日志文件個數(命令和控制備份個數一致,不再說明)--------------------------

LogFileDir=/mnt/data/backup_database_log
LogFileNum=$(ls -l $LogFileDir |sed 1d|wc -l)
while (($LogFileNum > $ReservedNum)); do
  LogOldFile=$(ls -rt $LogFileDir | head -1)
  echo $(date +"%Y/%m/%d-%H:%M:%S") "Delete File:"$LogOldFile
  rm -rf $LogFileDir/$LogOldFile
  let "LogFileNum--"
done

 

echo "-------Complete!--------"

以上的腳本解釋有明白的地方,可以在評論區留下問題。

2.將腳本添加到系統定時任務列表中

在Linux中執行命令 crontab -e 編輯定時任務列表,在末尾加入:

30 2 * * * 腳本絕對路徑 > 日志文件絕對路徑 2>&1 &

ps:日志文件的名稱最好拼接上時間,方便查看

就代表每天的凌晨2點30分會執行一次腳本,並將執行過程寫入到日志文件中。

3.沒有了,你已經搞定了,Ohhhhhhhhhhhhhh!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM