PGSQL 定时远程整库备份策略
1.准备容器
准备一个postgres 容器镜像 用来连接远程的pg库
示例启动脚本
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
可以看到远程连接数据库成功
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 文件夹 此文件夹用于存储备份数据
因为 /data/pg 对应的容器映射目录为 /var/lib/postgresql/data
所以在 容器的 /var/lib/postgresql/data 目录下会出现 /mysh/backup.sh
4.执行脚本测试
退出容器
执行命令查看backup.sh 是否能正常执行
docker exec postgres bash -c "source /etc/profile && /var/lib/postgresql/data/mysh/backup.sh"
执行命令后可以看到 /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
6.总结
1.重点注意容器的相关映射路径
2.docker容器的pgsql版本要和远程服务器的版本一致
3.注意backup.sh 里面备份的目录地址是容器的目录地址 因为最后这个脚本是在容器内执行的
4.其他命令都是死的 注意backup.sh 的参数配置 和 profile 的pg库密码配置