sql - 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
非常感谢
解决方案
推荐阅读
- python - 使用 python sql 插入 phpmyadmin 失败
- javascript - 你能告诉我他们的代码之间是否有任何区别。如果他们是,那么背后的原因是什么?
- webpack - Electron 在开发和构建的应用程序中伪造静态资产
- assembly - GDB中寄存器偏移1的可能原因是什么?
- r - R ggplot2 stat_density_2d 具有“..level..”功能,还有哪些其他功能可用?
- nginx - 我不断收到一个空的任务列表 APScheduler
- python - 基于文本的游戏统计
- php - $this 的快速修复不能在静态方法中使用?
- docker - HTTPS 加载但没有网络聊天聊天机器人
- jquery - 节点 Js - Express - CSURF:“无效的 csrf 令牌”