postggresq备份脚本
目录
自己编写的备份脚本
#!/bin/bash
#备份功能的话 记得 在 gkit 推送流水线的时候 要做逻辑分区 ,不要和当前的数据库用一个盘
# 备份文件目录
BKUP_DATADIR=/opt/srv/smartcare/hypergis/pg-data
# 日志文件目录
log_dir=/opt/srv/smartcare/hypergis/scripts
#备份日志
LOG_BK_FILE=${log_dir}/backupCtl_bk.log
LOG_FILE=${log_dir}/backupCtl.log
# 日志10M后要转储
MAX_LOGFILE_SIZE=10485760
# 写日志
function logMsg()
{
echo "$1" >> ${LOG_FILE}
}
# 清理日志文件,保留一个历史备份日志
function clearLogFile()
{
logFileSize=$(ls -l ${LOG_FILE} | awk '{print $5}')
if [[ ${logFileSize} -gt ${MAX_LOGFILE_SIZE} ]];then
logMsg "`date '+%Y-%m-%d %H %M %S'`:log file is greater than ${MAX_LOGFILE_SIZE},backup it now"
rm -rf ${LOG_BK_FILE}
mv ${LOG_FILE} ${LOG_BK_FILE}
fi
}
# 备份数据
function backupData()
{
logMsg "`date '+%Y-%m-%d %H %M %S'`:begin backup db"
local filename="datalinkbackup_`date '+%Y-%m-%d'`"
local backfile=${BKUP_DATADIR}'/'${filename}
docker exec $(docker ps |grep gis-postgresql:11.13|awk '{print $1}') sh -c 'source /opt/gis-postgresql/config/postgres_profile.sh && pg_dump --port 1523 --username datalink --no-password -d datalink --host 127.0.0.1 --format=c --blobs --encoding "UTF8" --verbose --file '${backfile}' &>> '${LOG_FILE}''
logMsg "`date '+%Y-%m-%d %H %M %S'`:end backup db"
}
#删除超过3天的备份文件
function clearFile()
{
filePath=$1
fileFlag=$2
logMsg "`date '+%Y-%m-%d %H %M %S'`:begin clearFile"
cd ${filePath}
local fileNum=$(ls -l |grep ${fileFlag}|wc -l)
#Backup files are retained for 7 days.
if [ ${fileNum} -ge 3 ];then
local deleteFile=$(ls -l |grep ${fileFlag} | awk -F ' ' '{print $9}'|awk 'NR==1{print}')
local time=$(stat -c %Y ${deleteFile})
for file in $(ls -l |grep ${fileFlag} | awk -F ' ' '{print $9}')
do
local fileCreatDate=$(stat -c %Y ${file})
if [[ ${fileCreatDate} < ${time} ]];then
deleteFile=${file}
fi
done
if [ -n "${deleteFile}" ];then
#clear old data
rm -rf ${deleteFile}
fi
fi
logMsg "`date '+%Y-%m-%d %H %M %S'`:end clearFile"
}
#backup
function backup_main()
{
#使用walsender进程判断是否主节点
primary_flag=`docker exec $(docker ps |grep gis-postgresql:11.13|awk '{print $1}') sh -c 'source /opt/gis-postgresql/config/postgres_profile.sh && pg_controldata -D /opt/srv/smartcare/hypergis/pg-data | grep "in production" |wc -l'`
if [[ "${primary_flag}" -eq 1 ]] then
#清理备份日志
clearLogFile
logMsg "`date '+%Y-%m-%d %H %M %S'`:this is primary db"
#是主节点就备份数据
backupData ${BKUP_DATADIR}
#删除超过3天的备份文件
clearFile ${BKUP_DATADIR} "datalinkbackup"
else
echo "this is standby db don backup db"
fi
}
backup_main