pgBackRest全量、增量、定时备份和恢复

417 阅读3分钟

1、测试环境

Ubuntu 20.04.3 LTS

timescaledb-ha:pg14.12-ts2.15.2-all-oss

pgBackRest 2.54.2

2、创建postgresql容器实例

docker:

  docker run -d \
  --name timescaledb \
  --publish 5433:5432 \
  --env TZ=Asia/Shanghai \
  --env POSTGRES_PASSWORD=123456 \
  --volume /data/postgres/pgdata/data:/home/postgres/pgdata/data \
  --volume /data/postgres/pgdata/backup:/home/postgres/pgdata/backup \
  --volume /data/postgres/pgdata/backup/pgbackrest.conf:/home/postgres/pgdata/backup/pgbackrest.conf \
  --log-driver=journald \
  --restart always \
  registry.cn-wulanchabu.aliyuncs.com/ribbon-images/timescaledb-ha:pg14.12-ts2.15.2-all-oss

注意:

查看镜像的数据目录,根据实际的目录进行宿主机挂载

pg数据目录: /home/postgres/pgdata/data

备份目录:/home/postgres/pgdata/backup

pgBackRest配置文件:/home/postgres/pgdata/backup/pgbackrest.conf

3、创建备份目录并设置权限

/data/postgres/pgdata/data

/data/postgres/pgdata/backup

/data/postgres/pgdata/backup/pgbackrest.conf

mkdir -p /data/postgres/pgdata/data  
chmod 750 /data/postgres/pgdata/data  
chown 1000:1000 /data/postgres/pgdata/data

4、安装 pgbackrest

进入容器安装 pgbackrest

docker exec -u 0 -it timescaledb bash

# 在容器内执行
apt update&& apt upgrade -y && apt install -y pgbackrest

5、配置 pgbackrest

5.1、创建配置文件 pgbackrest.conf

编辑 vim /data/postgres/pgdata/backup/pgbackrest.conf

# 增加下面内容
[global]
repo1-path=/var/lib/pgbackrest      # 容器内的备份仓库路径(需挂载到宿主机)
repo1-retention-full=3             # 保留 3 个全量备份
repo1-retention-diff=7             # 保留 7 个增量备份
process-max=4                       # 并行压缩/传输
compress-type=lz4                   # 压缩算法
start-fast=y                        # 快速启动备份
log-level-console=info

[mycluster]
pg1-path=/var/lib/postgresql/data   # 容器内的数据库数据目录

5.2、修改 PostgreSQL 配置

1、编辑 /data/postgres/pgdata/data/postgresql.conf

archive_mode = on
archive_command = 'pgbackrest --stanza=mycluster archive-push %p'
archive_timeout = 3600   #该时间根据实际需求修改
wal_level = replica

注意: mycluster必须和后面的创建备份存储库名称保持一致

2、修改pg_hba.conf,确认允许本地 TCP/IP 连接:

编辑 /data/postgres/pgdata/data/pg_hba.conf

local   all             all                            trust  # 允许本地 socket 连接
host    all             all             127.0.0.1/32    trust  # 允许本地 TCP/IP 连接

3、重启容器使配置生效:

docker restart timescaledb

6、初始化并执行备份

6.1、创建备份存储库

docker exec -it timescaledb pgbackrest --stanza=mycluster stanza-create

6.2、全量备份

docker exec -it timescaledb pgbackrest --stanza=mycluster --type=full backup

6.3、增量备份

docker exec -it timescaledb pgbackrest --stanza=mycluster --type=incr backup

6.4、查看备份列表

docker exec timescaledb pgbackrest --stanza=mycluster info

1740540921017.jpg

6.5、定时备份

6.5.1、编辑crontab添加定时任务

crontab -e

注意: 第一次需要选择使用vim还是nano编辑

6.5.2、添加任务

每天凌晨 2 点自动执行增量备份

0 2 * * * /usr/bin/docker exec timescaledb pgbackrest --stanza=mycluster --type=incr backup

1740541050168.jpg

查看任务列表

crontab -l 

1740542054910.jpg

6.5.3、查看日志

tail -f -n 200 /var/log/syslog | grep CRON

7、恢复数据

7.1、停止容器

docker stop timescaledb

7.2、执行恢复

使用匿名容器把数据恢复到pg的数据目录

docker run --rm -v /data/postgres/pgdata/data:/home/postgres/pgdata/data \
  -v /data/postgres/pgdata/backup:/home/postgres/pgdata/backup \
  -v /data/postgres/pgdata/backup/pgbackrest.conf:/home/postgres/pgdata/backup/pgbackrest.conf \
  registry.cn-wulanchabu.aliyuncs.com/ribbon-images/timescaledb-ha:pg14.12-ts2.15.2-all-oss \
  pgbackrest --stanza=mycluster restore 

7.3、重新启动容器

docker start timescaledb

8、扩展建议

8.1、混合备份策略

每周一次全量备份 + 每日增量备份,减少恢复时间

# 每周日凌晨 2 点全量备份(UTC)
0 2 * * 0 docker exec timescaledb pgbackrest --stanza=mycluster --type=full backup
# 每日凌晨 2 点增量备份(UTC)
0 2 * * 1-6 docker exec timescaledb pgbackrest --stanza=mycluster --type=incr backup

8.2、备份保留策略

在 pgbackrest.conf 中配置保留策略,例如保留 3 个全量备份

[global]
repo1-retention-full=3

8.3、加密与压缩

如果备份敏感数据,启用加密和压缩

repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=YourSecurePassword
compress=y