PGSQL 定时远程整库备份策略

PGSQL 定时远程整库备份策略

1.准备容器

准备一个postgres 容器镜像 用来连接远程的pg库

image-20230331113350649

示例启动脚本

docker run -d --restart always --name postgres -p 5432:5432 -v /etc/localtime:/etc/localtime:ro -e POSTGRES_PASSWORD=123456-v /data/pg:/var/lib/postgresql/data mdillon/postgis:latest

这里可以看到 我们挂载了 /data/pg目录 到pgsql的数据目录空间

2.准备profile环境变量

示例:

前面都是默认的 重点在 PGPASSWORD 这里填上需要远程登录的pg库的密码

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi



export PGPASSWORD='123456'


在服务器的/data/pgfile 目录创建 profile 文件 粘贴上述文件内容

在这里插入图片描述

执行docker cp 命令 将profile 环境配置拷贝到容器里

示例: docker cp 本地目录 容器名称:容器目录

docker cp /data/pgfile/profile postgres:/etc

环境变量拷贝到容器目录后可以进入容器查看

这里可以看到 容器的 /etc/profile 已经被我们替换

在这里插入图片描述

然后容器内使用 source /etc/profile

执行命令

 psql 172.19.52.5 -U postgres -p 5432 -d postgres

可以看到远程连接数据库成功

image-20230331120641051

3.准备backup.sh 备份脚本

示例:

#!/bin/bash

# 数据库信息
DB_HOST=172.19.52.5
DB_PORT=5432
DB_USER=postgres
DB_NAME=ry-cloud
#文备份文件夹目录
BACKUP_DIR=/var/lib/postgresql/data/backup

#备份文件名称
BACKUP_FILE=$BACKUP_DIR/ry-cloud-$(date +%Y%m%d%H%M%S).sql.gz


pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d  $DB_NAME   | gzip >$BACKUP_FILE 


#查找1天前的数据 删除
find $BACKUP_DIR -type f -name "*.gz" -mtime +1 -exec rm {
    
    } \;






在 /data/pg 目录下创建 mysh 文件夹 在mysh文件夹下创建 backup.sh 脚本文件

在/data/pg 目录下创建 backup 文件夹 此文件夹用于存储备份数据

image-20230331121110169

因为 /data/pg 对应的容器映射目录为 /var/lib/postgresql/data

所以在 容器的 /var/lib/postgresql/data 目录下会出现 /mysh/backup.sh

image-20230331121251388

4.执行脚本测试

退出容器

执行命令查看backup.sh 是否能正常执行

docker exec  postgres bash -c "source /etc/profile && /var/lib/postgresql/data/mysh/backup.sh"

image-20230331121703564

执行命令后可以看到 /data/pg/backup 目录出现了一个备份文件 这就是pg_dump 下来的整库压缩包

5.linux crontab 设置任务定时执行

使用 crontab -e 编辑定时任务 在下方 添加备份命令 就完了

使用命令编辑 crontab 定时任务

crontab -e 

每天凌晨两点 执行备份命令

0 2 * * *  sudo docker exec  postgres bash -c "source /etc/profile && /var/lib/postgresql/data/mysh/backup.sh" >> /data/pg/mysh/my.log 2>&1

image-20230331122041465

6.总结

1.重点注意容器的相关映射路径

2.docker容器的pgsql版本要和远程服务器的版本一致

3.注意backup.sh 里面备份的目录地址是容器的目录地址 因为最后这个脚本是在容器内执行的

4.其他命令都是死的 注意backup.sh 的参数配置 和 profile 的pg库密码配置

猜你喜欢

转载自blog.csdn.net/qq_37349379/article/details/130088847