pgsql数据库自动备份

本文的写作原因:对实际客户需求的一次小总结,顺带做一次笔记

数据库备份方案起因

任何数据库都需要备份,备份数据是维护数据库必不可少的操作。

数据库备份常见的应用场景:

  1. 硬件故障造成数据库部分数据或全部数据丢失
  2. 人为操作失误造成某些数据被误操作
  3. 软件 BUG 造成部分数据或全部数据丢失
  4. ……

对于上述场景还有很多,公司里面让我做数据库备份就以上三个原因(只针对我们公司的业务来说)

数据库备份的实际操作

测试环境:
    centos 7
    docker 20.10.12
    postgis/postgis:13-master

老板要求数据库备份的这个方案最好能跟着数据库启动自动配置,不需要人工配置,且能够清除历史备份(这个算基本需求)

注意:下面所提到的脚本文件都放在同一个目录下

一、选择数据库备份时间

在业务闲时,设置定时任务crontab定时任务(每日凌晨),全量备份,这里查看过pgsql的官方文档最后决定使用pg_basebackup的命令来实现,其他方式看了一下不太适合我这个菜鸡。

二、编写数据库备份脚本

数据库备份及删除历史备份,脚本如下(backup.sh)

#!/bin/bash

#利用docker命令向容器打入命令
docker exec --user postgres postgis pg_basebackup  -F t -z -R -D /data/backup

#做个异常识别,不然长时间备份不成功会把以前的备份删掉
if [ $? -ne 0 ]; then
    echo "failed to backup"
    exit 1
else
    echo "succeed to backup"
fi

#移动备份文件(从docker映射路径移到其他地方)
mv /data/db/postgis/data/backup /data/postgresql/backup/data/$(date +%Y%m%d%H%M%S)

#sevendays_time=$(date -d -7days '+%Y%m%d')
#删除超过七天的文件
cd /data/postgresql/backup/data
rm -rf $(date -d -7days '+%Y%m%d')*

三、将定时任务配置到服务器的定时任务上

将backup.sh的操作任务配置到crontab上,脚本如下(confBackup.sh)

#!/bin/bash

myShell=backup.sh
filePath=$(cd "$(dirname "$0")";pwd)
echo $filePath
echo $myShell

crontab -l > cron
number=`grep -n "$myShell" cron | cut -d ":" -f 1`
aa=$number
echo $aa

if [ -z $aa ];
then
echo "该任务不存在,将添加"
echo '* 0 * * * '$filePath'/'$myShell'' >> cron
crontab cron
rm -f cron
else
echo "该任务已经存在,将会先删除再添加"
sed -i '/'$myShell'/d' cron
echo '* 0 * * * '$filePath'/'$myShell'' >> cron
crontab cron
rm -f cron
fi

四、docker启动数据库脚本

其余docker的yml配置文件省略,编写pgsql的启动命令,脚本如下(start.sh)

#!/bin/bash

docker-compose -f postgis.yml up -d

./confBackup.sh

结束

这个自动备份脚本花了我半天时间研究,其中一个最坑的就是我在脚本上加了-it,这个-it命令是为了开启容器终端,你必须指定参数,但是我是在脚本执行,所以导致我的脚本只能手动运行(backup.sh),不能在定时任务执行,坑的命令:docker exec -it --user postgres postgis pg_basebackup -F t -z -R -D /data/backup

参考资料:
定时任务:https://www.runoob.com/w3cnote/linux-crontab-tasks.html
数据库备份:http://www.postgres.cn/docs/9.4/app-pgbasebackup.html
封面图片来自:深圳卫健委
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值