首页 > 解决方案 > Postgres 轮换 cron 备份

问题描述

我正在尝试制作一个脚本,该脚本将执行以下操作:

连接到 postgres 数据库,进行转储,gzip 转储并存储到目录。

所有这些都必须轮换 - 一天 24 个备份,一周 7 个备份

文件名必须在文件名中包含日期、小时和分钟。

必须删除旧的(我不想要描述的更多备份)

该脚本将通过 cron 每小时运行一次。

我写了这个脚本(改变了一些在网上找到的)但有一些错误:

1)它说:“awk:第1行:行尾或接近行尾的语法错误”

2)当我运行脚本时,它会覆盖每日备份并且不要创建新的

3)小时备份只制作名称为“hourly”的文件夹并且没有进行备份

4) 所有备份将通过 rsync 备份到 Synology NAS

任何人都可以帮助我吗?

脚本备份.sh:

# !/bin/bash

# for use with cron, eg:
# 0 3 * * * postgres /var/db/db_backup.sh example_db

if [[ -z "$1" ]]; then
    echo "Usage: $0 <example_db> [pg_dump example_db]"
    exit 1
fi

DB="$1"; shift
DUMP_EXAMPLE_DB=$@
DIR="/var/db/backups/$DB"

KEEP_HOURLY=24
KEEP_DAILY=7
KEEP_WEEKLY=5
KEEP_MONTHLY=12

function rotate {
    rotation=$1
    fdate=`date +%Y-%m-%d-$H -d $date`
    file=$DIR/daily/*$fdate*.gz
    mkdir -p $DIR/$rotation/ || abort
    if [ -f $file ]; then
        cp $file $DIR/$rotation/ || abort
    else
        echo
    fi
}

function prune {  
    dir=$DIR/$1
    keep=$2
    ls $dir | sort -rn | awk " NR > $keep" | while read f; do rm $dir/$f; done
}

function abort {
    echo "aborting..."
    exit 1
}

mkdir -p $DIR/hourly || abort
mkdir -p $DIR/daily || abort
mkdir -p $DIR/weekly || abort
mkdir -p $DIR/monthly || abort
mkdir -p $DIR/yearly || abort

date=`date +%Y-%m-%d` || abort
hour=`date -d $date +%H` || abort
minute=`date -d $date +M` || abort
day=`date -d $date +%d` || abort
weekday=`date -d $date +%w` || abort
month=`date -d $date +%m` || abort

# Do the daily backup
/usr/bin/pg_dump $DB $DUMP_EXAMPLE_DB | gzip > $DIR/daily/${DB}_$date.gz
test ${PIPESTATUS[0]} -eq 0 || abort

# Perform rotations
if [[ "$weekday" == "0" ]]; then
    rotate weekly
fi
if [[ "$hour/$minute" == "0/0" ]]; then
    rotate hourly
fi
if [[ "$day" == "01" ]]; then
    rotate monthly
fi
if [[ "$month/$day" == "01/01" ]]; then
    rotate yearly
fi

prune hourly $KEEP_HOURLY
prune daily $KEEP_DAILY
prune weekly $KEEP_WEEKLY
prune monthly $KEEP_MONTHLYOD

非常感谢

标签: sqldatabasepostgresqlcronbackup

解决方案


推荐阅读