前情提要:
項目馬上要上線之際,某摸魚小伙正在和妹子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!