1、脚本内容config_backup.sh
#!/bin/bash
set -e
homepath=~
sh_archive_path="$homepath/move_and_clear_archive.sh"
v_backup="/database/panweidb/backup"
#manual_arch_dest=''
######
instance='panweidb'
keeps=3
dbport=17700
if [[ -z $manual_arch_dest ]];then
v_archive=$(gsql -p$dbport -r -c 'show archive_dest' |grep '/')
v_archive=${v_archive# *}
else
v_archive=$manual_arch_dest
fi
if [[ -e $sh_archive_path ]];then
echo "The clean archive script already exists"
check_arch=$(cat $sh_archive_path |grep find |awk '{print $2}')
if [[ $check_arch == $v_archive ]];then
echo "The clean script archive path is the same"
else
echo "Warning: The clean script archive path is not the same. please check it."
echo "script archive path: $check_arch"
echo "expect archive path: $v_archive"
exit 2
fi
echo "Test it"
sh $sh_archive_path 9
else
if [[ -z $v_archive || $v_archive == '' ]];then
echo "error: get empty archive dest"
exit 1
fi
echo '#!/bin/bash' > $sh_archive_path
echo 'set -e' >> $sh_archive_path
echo "fnum=\$1
echo \"begin to clear archive log...in $v_archive\"
find $v_archive -mtime +\${fnum} -type f -name \"0000*\" | xargs rm -f
echo \"archive files clean successfully\"" >> $sh_archive_path
fi
#check archive mode
if [[ $1 == 'config' ]];then
gs_probackup init -B $v_backup
mkdir $v_backup/log
echo "The backupdir is $v_backup ,The datadir is $PGDATA"
gs_probackup add-instance -B $v_backup --instance=$instance -D $PGDATA -p $dbport --retention-redundancy=${keeps} --retention-window=0
gs_probackup show -B $v_backup -D $PGDATA
gs_probackup show-config -B $v_backup --instance=$instance -D $PGDATA
crontab -l
current_cron_jobs=$(crontab -l 2>/dev/null)
new_cron_job="30 00 */3 * * source $homepath/.bashrc;gs_probackup backup --backup-path=$v_backup --instance=$instance --backup-mode=full --delete-expired --pgdatabase=postgres --compress-algorithm=zstd --compress-level=3 -j 4 > ${v_backup}/log/backup_week$(date +\%u).log 2>&1 &
0 */2 * * * sh $homepath/move_and_clear_archive.sh 9
10 00 * * * source $homepath/.bashrc; gs_probackup delete -B $v_backup --status=ERROR --instance=panweidb > /dev/null 2>&1 &"
echo -e "$current_cron_jobs\n###\n$new_cron_job" | crontab -
crontab -l
else
data_size=$(du -sm $PGDATA |awk '{print $1}')
free_size=$(df -Pm "$v_backup" | tail -1 | awk '{print $4}')
total_size=$(df -Pm "$v_backup" | tail -1 | awk '{print $2}')
data_mount=$(df -Pm "$PGDATA"|tail -1 |awk '{print $NF}')
backup_mount=$(df -Pm "$v_backup"|tail -1 |awk '{print $NF}')
need_size=$(echo "$data_size * ($keeps + 1)/0.9" |bc)
echo "backup dir $v_backup mount at as below"
df -Pm "$v_backup"
if [[ -d $v_backup/backups ]];then
gs_probackup show -B $v_backup
minus_keeps=$(gs_probackup show -B $v_backup |grep FULL |wc -l)
keeps=$(gs_probackup show-config -B $v_backup --instance=$instance -D $PGDATA|grep retention-redundancy |awk '{print $3}')
echo "INFO: current retention-redundancy is $keeps"
keeps=$(echo "$keeps - $minus_keeps"|bc)
onebackup_size=$(gs_probackup show -B $v_backup |grep FULL |head -1 |awk '{print $10}')
#echo ${onebackup_size}
suffix=${onebackup_size: -2}
if [[ $suffix == 'MB' ]];then
data_size=${onebackup_size%MB}
echo "INFO: one backup size is $data_size MB"
elif [[ $suffix == 'GB' ]];then
data_size=$(echo "${onebackup_size%GB} * 1024" |bc )
echo "INFO: one backup size is $data_size MB"
elif [[ $suffix == 'TB' ]];then
data_size=$(echo "${onebackup_size%TB} * 1024 * 1024" |bc )
echo "INFO: one backup size is $data_size MB"
else
echo "INFO: no found backup size, it will use database data as evalute."
fi
need_size=$(echo "$data_size * ($keeps + 1)/0.9" |bc)
#echo $need_size
else
echo "INFO: The backup dir no config"
fi
if [[ $data_mount == $backup_mount ]];then
echo "The PGDATA and bckup at share disk $data_mount"
freez_pct=$(cm_ctl list --param --server -n 1 |grep datastorage_threshold_value_check |awk '{print $3}')
if [[ -z $freez_pct ]];then
freez_pct=100
fi
echo "datastorage_threshold_value_check: $freez_pct"
freez_size=$(echo "$total_size * $freez_pct/100"|bc)
tmp_size=$(echo $free_size + $freez_size - $total_size|bc )
echo "total size: $total_size MB"
echo "freez size: $freez_size MB"
echo "free size: $free_size MB"
echo "less free size: $tmp_size MB"
echo "need size: $need_size MB"
echo "data size: $data_size MB"
if [[ "$tmp_size" -lt "$need_size" ]];then
echo "Error: the free size not support this backup policy"
exit 11
else
echo "ok: free size is enough."
fi
else
echo "The PGDATA at $data_mount , backup at $backup_mount"
echo "free size: $free_size MB"
echo "need size: $need_size MB"
echo "data size: $data_size MB"
if [[ "$free_size" -lt "$need_size" ]];then
echo "Error: the free size not support this backup policy"
exit 11
else
echo "ok: free size is enough."
fi
fi
fi2、根据实际情况修改参数
v_backup ---表示备份的目录
keeps ---表示保留的备份数
dbport ---表示数据库端口
instance --表示add-instance 的实例名称
sh_archive_path --自动生成的归档清理脚本路径3、脚本使用
sh config_backup.sh 查看备份目录空间是否足够容纳所有备份数,不实际执行
sh config_backup.sh config 配置自动备份计划任务4、脚本说明
该脚本会自动初始化目录、建立备份并配置计划任务,备份为全备模式。「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




