暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库自动配置备份脚本及使用

原创 feilunshuai 2025-08-20
40

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




fi


2、根据实际情况修改参数

v_backup  ---表示备份的目录
keeps       ---表示保留的备份数
dbport      ---表示数据库端口
instance    --表示add-instance 的实例名称
sh_archive_path  --自动生成的归档清理脚本路径


3、脚本使用

sh config_backup.sh  查看备份目录空间是否足够容纳所有备份数,不实际执行
sh  config_backup.sh config  配置自动备份计划任务


4、脚本说明

该脚本会自动初始化目录、建立备份并配置计划任务,备份为全备模式。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论