目录

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