ezra-sullivan
发布于 2025-06-19 / 6 阅读
0
0

04 - PostgreSQL 备份工具 - pgBackRest -(3)快速入门

更新时间:2025 年 6 月

版本:pgbackrest 2.55.1

官方用户手册:pgBackRest User Guide - RHEL

配置官方文档:pgBackRest - Configuration Reference

命令行官方文档:pgBackRest - Command Reference

配置文件与命令行

参考:pgBackRest - Configuration Reference

pgbackrest 可以完全使用命令行进行备份恢复操作,但对于复杂或者需设置大量选项的安装,配置文件更为实用。配置文件的默认位置是 /etc/pgbackrest/pgbackrest.conf。如果该位置没有文件存在,则会检查旧的默认位置 /etc/pgbackrest.conf

优先级

命令行参数 优先级高于配置文件,可临时修改行为

建议

  • 使用配置文件统一管理环境变量、主机名、数据路径等
  • 使用命令行参数灵活控制操作类型与行为

Repository(存储库)

定义

repository 是 pgBackRest 存放 所有备份数据(backup)、WAL 日志归档(archive)、备份元数据的位置,也称为存储库或者备份仓库

类型

参考:pgBackRest - Configuration Reference

repository 当前支持多种类型

类型常用/推荐描述
posix默认类型/常用标准本地 POSIX 文件系统(例如 ext4、xfs、btrfs)
cifs-CIFS(Windows SMB 共享)类型。类似 posix,但禁用了软链接与目录 fsync
s3推荐Amazon S3 或兼容 S3 协议的对象存储(如 MinIO、Wasabi、Ceph 等)
azure-Microsoft Azure Blob 存储服务
gcs-Google Cloud Storage(GCP 的对象存储)
sftp-使用 SFTP 协议远程存储备份,适用于通过 SSH 储存备份的场景

注:repository 同样支持 NFS 挂载用作 posix 类型,但需遵循 PostgreSQL 对 NFS 的使用建议,详情参考:PostgreSQL: Documentation: 17: 18.2. Creating a Database Cluster

多仓库(Multiple repositories)

参考:pgBackRest User Guide - RHEL

简介

pgBackRest 支持配置多个备份仓库,通过 repoX( 例如:repo1repo2) 编号进行标识,每个仓库具有独立的存储位置与配置参数。这种机制称为 Multi-Repo(多仓库)

作用

  • 本地 + 云端备份,增强容灾能力
    • repo1 用于快速本地恢复
    • repo2 用于云端异地容灾(如 S3、Azure)
  • 备份冗余,提升数据安全性
    • 同时存储到多个仓库,防止单一存储故障丢失数据
  • 冷热数据分离,优化存储成本
    • 本地仓库只保留近期备份,云端仓库长期归档
  • 支持备份迁移或升级
    • 通过新 repo 可平滑将备份迁移至新存储系统
  • 灵活备份策略与恢复选择
    • 可选择从任意仓库进行恢复、校验或过期策略控制
  • 便于测试和验证备份可靠性
    • 可以从不同仓库分别恢复做验证测试,确保可用性

注意事项

  • archive-push 命令始终会将 WAL 推送到所有配置的存储库中的归档。如果某个存储库无法访问,但还要 WAL 正常推送到其他存储库,则必须启用 archive-async=y
  • 如果 WAL 无法推送到任何存储库,PostgreSQL 将不会将其从 pg_wal 目录中删除,这可能导致卷空间耗尽
  • 每个存储库都需要单独设置备份。因为备份类型和保留策略会因存储库而异。同样,恢复操作必须指定一个存储库

常见配置项

POSIX 类型

[global]
# 控制台日志级别(off、error、warn、info、detail、debug、trace)
log-level-console=info
# 文件日志级别(off、error、warn、info、detail、debug、trace)
log-level-file=detail
# 文件压缩算法(支持 none、gz、bz2、lz4、zst)
compress-type=gz
# 文件压缩级别(1-19,默认 3)
compress-level=3
# 在备份开始前,pgbackrest 自动发起一个 checkpoint,而不是等待 PG 的 checkpoint(会比较慢)
# 推荐配置
start-fast=y


# 仓库类型为本地 POSIX 文件系统
repo1-type=posix
# 备份(backup)和存档(archive)存储的路径
repo1-path=/data/pgbackrest
# 是否启用硬链接节省空间
repo1-hardlink=y
# 保留全量备份数量
repo1-retention-full=2
# 全量备份过期策略:count 或 time
repo1-retention-full-type=count
# 保留差异备份数量
repo1-retention-diff=4
# 加密算法(可选:aes-256-cbc)
repo1-cipher-type=aes-256-cbc
# 加密密钥
repo1-cipher-pass=YOUR_ENCRYPT_PASSWORD



[main]

# socket 目录,注意与 PG 的配置 unix_socket_directories 一致
pg1-socket-path=/tmp
# 登录的数据库
pg1-database=postgres
# 登录的数据库用户
pg1-user=postgres
# PostgreSQL 数据目录
pg1-path=/data/pgsql/17



S3 类型

[global]

# 控制台日志级别(off、error、warn、info、detail、debug、trace)
log-level-console=info
# 文件日志级别(off、error、warn、info、detail、debug、trace)
log-level-file=detail
# 文件压缩算法(支持 none、gz、bz2、lz4、zst)
compress-type=gz
# 文件压缩级别(1-19,默认 3)
compress-level=3
# 在备份开始前,pgbackrest 自动发起一个 checkpoint,而不是等待 PG 的 checkpoint(会比较慢)
# 推荐配置
start-fast=y

# 仓库类型为 S3
repo1-type=s3
# 仓库路径
repo1-path=/pgbackrest


# S3 的 bucket 名称
repo1-s3-bucket=my-bucket
# S3 区域
repo1-s3-region=us-east-1
# S3 endpoint,兼容 MinIO/Wasabi 等
repo1-s3-endpoint=s3.amazonaws.com
# S3 访问密钥 ID
repo1-s3-key=AKIA...
# S3 密钥
repo1-s3-key-secret=xxxxxxxxxxxx
# S3 URI 风格,host 或 path
repo1-s3-uri-style=host


# 是否验证 TLS
repo1-storage-verify-tls=y  
# 全量备份数量
repo1-retention-full=3
# 全量过期策略
repo1-retention-full-type=count
# 差异备份数量
repo1-retention-diff=4
# 启用加密
repo1-cipher-type=aes-256-cbc
# 加密密钥
repo1-cipher-pass=YOUR_ENCRYPT_PASSWORD

[main]

# socket 目录,注意与 PG 的配置 unix_socket_directories 一致
pg1-socket-path=/tmp
# 登录的数据库
pg1-database=postgres
# 登录的数据库用户
pg1-user=postgres
# PostgreSQL 数据目录
pg1-path=/data/pgsql/17

远程 Repository

注:远程 Repository (独立备份主机)需要 免密 SSH 或者 TLS 认证

注:使用远程 Repository 时,最好将服务通过 systemd 管理

主库配置

[global]
# 控制台日志级别(off、error、warn、info、detail、debug、trace)
log-level-console=info
# 文件日志级别(off、error、warn、info、detail、debug、trace)
log-level-file=detail
# 文件压缩算法(支持 none、gz、bz2、lz4、zst)
compress-type=gz
# 文件压缩级别(1-19,默认 3)
compress-level=3
# 在备份开始前,pgbackrest 自动发起一个 checkpoint,而不是等待 PG 的 checkpoint(会比较慢)
# 推荐配置
start-fast=y


# 仓库服务器主机名(可为 IP)
repo1-host=repo-server
# 仓库服务器 SSH 用户(需配置免密)
repo1-host-user=pgbackrest
# 仓库服务器 SSH 端口
repo1-host-port=22
# 仓库在远程服务器上的路径
repo1-path=/data/pgbackrest

# 仓库类型为 POSIX(远程主机本地文件系统)
repo1-type=posix
# 全量备份保留数量
repo1-retention-full=2
# 差异备份保留数量
repo1-retention-diff=4



[main]

# PostgreSQL 数据目录
pg1-path=/data/17/data

远程库配置

[global]
# 控制台日志级别(off、error、warn、info、detail、debug、trace)
log-level-console=info
# 文件日志级别(off、error、warn、info、detail、debug、trace)
log-level-file=detail
# 文件压缩算法(支持 none、gz、bz2、lz4、zst)
compress-type=gz
# 文件压缩级别(1-19,默认 3)
compress-level=3
# 在备份开始前,pgbackrest 自动发起一个 checkpoint,而不是等待 PG 的 checkpoint(会比较慢)
# 推荐配置
start-fast=y

# 仓库路径
repo1-path=/data/pgbackrest

# 仓库类型为本地 POSIX
repo1-type=posix

Stanza(配置节)

定义

Stanza 是 pgBackRest 中的逻辑配置单元,它代表一个特定的 PostgreSQL 数据库集群,并定义了该集群的备份如何存储、管理和恢复

作用

用于 隔离和管理不同 PostgreSQL 集群 的备份,每个集群用不同的 stanza 名称。名称可以自定义,例如 mainpg17prod-db,在命令和配置中通过 --stanza=xxx 指定

多实例(multi-stanza)

参考:pgBackRest User Guide - RHEL

允许在一个 stanza 下配置多个 PostgreSQL 实例(如主节点 + 多个从节点)

作用和意义

  • 实现主从备份容错:主库无法备份时自动使用从库。
  • 支持多节点还原选择:恢复时可选择从哪个节点恢复数据。
  • 用于分布式部署环境:例如 PostgreSQL 主从复制架构

示例

# stanza 名为 main
[main]                       
pg1-host=db-master           # 主节点
pg1-path=/var/lib/pgsql/15/data
pg1-port=5432

pg2-host=db-standby1         # 从节点1
pg2-path=/var/lib/pgsql/15/data
pg2-port=5432

pg3-host=db-standby2         # 从节点2
pg3-path=/var/lib/pgsql/15/data
pg3-port=5432

常用配置项

# --- 这是全局配置段 ---
[global]
# 本地备份仓库路径
repo1-path=/var/lib/pgbackrest

# 开启压缩(lz4 推荐,兼顾压缩比和性能)
compress-type=lz4

# 控制台日志级别(建议 info 或 warn)
log-level-console=info

# 快速备份启动
start-fast=y

# 全量备份保留数量(例如保留最近2个)
repo1-retention-full=2

# --- 这是 stanza "main" 的配置段 ---
[main]
# PostgreSQL 数据目录(必须与实际路径一致)
pg1-path=/data/pgsql/17/data

# PostgreSQL 实例端口(可选)
pg1-port=5432

# PostgreSQL 用户用于连接(可选)
pg1-user=postgres

# PostgreSQL 主机名(本地可省略)
# pg1-host=127.0.0.1

# 如果 archive_command 使用了 SSH 推送 WAL 日志,这里需要指定主机和路径
# pg1-host-user=postgres
# pg1-host-path=/data/pgsql/17/data

# 当使用 SSH 模式远程备份时可启用(本地可忽略)
# pg1-host-config=/etc/pgbackrest/pgbackrest.conf

示例 - 本地备份

参考:pgBackRest User Guide - RHEL

主机

主机名操作系统IP角色安装软件
postgresql-01.db.localAlmaLinux 9.6192.168.111.196数据库主机PostgreSQL 17
pgbackrest 2.55.x

部署软件过程略

准备

基础变量设置

# 本地 repository 目录
PGBACKREST_REPO_DIR="/data/pgbackrest"

创建 repository 目录

mkdir -p ${PGBACKREST_REPO_DIR}


chown -R postgres:postgres ${PGBACKREST_REPO_DIR}

配置

pgbackrest 配置

生成加密秘钥

openssl rand -base64 48

配置

vim /etc/pgbackrest/pgbackrest.conf

[global]
# 控制台日志级别(off、error、warn、info、detail、debug、trace)
log-level-console=info
# 文件日志级别(off、error、warn、info、detail、debug、trace)
log-level-file=detail
# 文件压缩算法(支持 none、gz、bz2、lz4、zst)
compress-type=gz
# 文件压缩级别(1-19,默认 3)
compress-level=3
# 在备份开始前,pgbackrest 自动发起一个 checkpoint,而不是等待 PG 的 checkpoint(会比较慢)
# 推荐配置
start-fast=y


# 仓库类型为本地 POSIX 文件系统
repo1-type=posix
# 备份(backup)和存档(archive)存储的路径
repo1-path=/data/pgbackrest
# 是否启用硬链接节省空间
repo1-hardlink=y
# 保留全量备份数量
repo1-retention-full=2
# 全量备份过期策略:count 或 time
repo1-retention-full-type=count
# 保留差异备份数量
repo1-retention-diff=4
# 加密算法(可选:aes-256-cbc)
repo1-cipher-type=aes-256-cbc
# 加密密钥
repo1-cipher-pass=9Ys1VvOBuK9cqXGHMty9UQmvWHYll2c6pBp3tDLmrqi9jqASyNIgLPj0cdfnWyAT




[demo]
# socket 目录,注意与 PG 的配置 unix_socket_directories 一致
pg1-socket-path=/tmp
# 登录的数据库
pg1-database=postgres
# 登录的数据库用户
pg1-user=postgres
# PostgreSQL 数据目录
pg1-path=/data/pgsql/17


注:一旦配置了仓库并创建了 stanza 并进行了检查,仓库加密设置就不能再更改

创建 stanza

sudo -iu postgres pgbackrest --stanza=demo --log-level-console=info stanza-create


# 输出如下信息
2025-06-18 21:43:27.557 P00   INFO: stanza-create command begin 2.55.1: --exec-id=43797-0ac6bfb6 --log-level-console=info --log-level-file=detail --pg1-database=postgres --pg1-path=/data/pgsql/17 --pg1-socket-path=/tmp --pg1-user=postgres --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/data/pgbackrest --repo1-type=posix --stanza=demo
2025-06-18 21:43:27.595 P00   INFO: stanza-create for stanza 'demo' on repo1
2025-06-18 21:43:27.610 P00   INFO: stanza-create command end: completed successfully (59ms)

PG 配置

修改 PostgreSQL 配置以支持 WAL 归档备份

$ vim ${PGDATA}/postgresql.conf


wal_level = replica
max_wal_senders = 3
wal_keep_size = 128MB

archive_mode = on
archive_timeout = 60

# stanza 为 demo,需要与配置一致
archive_command = '/usr/bin/pgbackrest --stanza=demo archive-push %p'

重启生效

systemctl restart postgresql-${PG_MAJOR_VERSION}

检查配置

sudo -u postgres pgbackrest --stanza=demo --log-level-console=info check

# 输出如下信息
2025-06-18 21:45:50.865 P00   INFO: check command begin 2.55.1: --exec-id=43892-06f2af46 --log-level-console=info --log-level-file=detail --pg1-database=postgres --pg1-path=/data/pgsql/17 --pg1-socket-path=/tmp --pg1-user=postgres --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/data/pgbackrest --repo1-type=posix --stanza=demo
2025-06-18 21:45:50.887 P00   INFO: check repo1 configuration (primary)
2025-06-18 21:45:50.970 P00   INFO: check repo1 archive for WAL (primary)
2025-06-18 21:45:51.272 P00   INFO: WAL segment 000000010000000000000003 successfully archived to '/data/pgbackrest/archive/demo/17-1/0000000100000000/000000010000000000000003-f66c3937c6d3b24b1251a91c5666d3cc06d70df0.gz' on repo1
2025-06-18 21:45:51.272 P00   INFO: check command end: completed successfully (412ms)

备份操作

参考:pgBackRest - Command Reference

执行备份

注:默认情况下(不指定 --type 选项),pgbackrest 会尝试执行增量备份。但是,增量备份必须基于完整备份,如果不存在完整备份,pgbackrest 会直接执行完整备份

完整备份

sudo -iu postgres pgbackrest --stanza=demo \
       --type=full  \
       --log-level-console=info \
       backup

# 输出信息
2025-06-18 21:50:05.886 P00   INFO: backup command begin 2.55.1: --compress-level=3 --compress-type=gz --exec-id=43964-fd79b26b --log-level-console=info --log-level-file=detail --pg1-database=postgres --pg1-path=/data/pgsql/17 --pg1-socket-path=/tmp --pg1-user=postgres --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-hardlink --repo1-path=/data/pgbackrest --repo1-retention-diff=4 --repo1-retention-full=2 --repo1-retention-full-type=count --repo1-type=posix --stanza=demo --type=full
2025-06-18 21:50:05.917 P00   INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
2025-06-18 21:50:06.110 P00   INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
2025-06-18 21:50:06.110 P00   INFO: check archive for prior segment 000000010000000000000005
2025-06-18 21:50:10.210 P00   INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2025-06-18 21:50:10.266 P00   INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000120
2025-06-18 21:50:10.268 P00   INFO: check archive for segment(s) 000000010000000000000006:000000010000000000000006
2025-06-18 21:50:10.591 P00   INFO: new backup label = 20250618-215005F
2025-06-18 21:50:10.660 P00   INFO: full backup size = 52.7MB, file total = 1775
2025-06-18 21:50:10.661 P00   INFO: backup command end: completed successfully (4780ms)
2025-06-18 21:50:10.661 P00   INFO: expire command begin 2.55.1: --exec-id=43964-fd79b26b --log-level-console=info --log-level-file=detail --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/data/pgbackrest --repo1-retention-diff=4 --repo1-retention-full=2 --repo1-retention-full-type=count --repo1-type=posix --stanza=demo
2025-06-18 21:50:10.662 P00   INFO: expire command end: completed successfully (1ms)

差异备份

sudo -iu postgres pgbackrest --stanza=demo \
       --type=diff  \
       --log-level-console=info \
       backup

增量备份

基于上一个备份(全量或差异)做增量备份

sudo -iu postgres pgbackrest --stanza=demo \
       --type=incr   \
       --log-level-console=info \
       backup

定时备份

查看备份信息

sudo -iu postgres pgbackrest info


# 输出信息
stanza: demo
    status: ok
    cipher: aes-256-cbc

    db (current)
        wal archive min/max (17): 000000010000000000000003/000000010000000000000014

        full backup: 20250618-215005F
            timestamp start/stop: 2025-06-18 21:50:05+08 / 2025-06-18 21:50:10+08
            wal start/stop: 000000010000000000000006 / 000000010000000000000006
            database size: 52.7MB, database backup size: 52.7MB
            repo1: backup set size: 9.1MB, backup size: 9.1MB

        diff backup: 20250618-215005F_20250618-215632D
            timestamp start/stop: 2025-06-18 21:56:32+08 / 2025-06-18 21:56:35+08
            wal start/stop: 00000001000000000000000A / 00000001000000000000000A
            database size: 52.7MB, database backup size: 536.3KB
            repo1: backup set size: 9.1MB, backup size: 155KB
            backup reference total: 1 full

        diff backup: 20250618-215005F_20250618-215953D
            timestamp start/stop: 2025-06-18 21:59:53+08 / 2025-06-18 22:04:14+08
            wal start/stop: 00000001000000000000000D / 000000010000000000000011
            database size: 75.0MB, database backup size: 22.9MB
            repo1: backup set size: 11MB, backup size: 2MB
            backup reference total: 1 full

        incr backup: 20250618-215005F_20250618-220716I
            timestamp start/stop: 2025-06-18 22:07:16+08 / 2025-06-18 22:07:18+08
            wal start/stop: 000000010000000000000013 / 000000010000000000000014
            database size: 75.0MB, database backup size: 1.3MB
            repo1: backup set size: 11MB, backup size: 243KB
            backup reference total: 1 full, 1 diff

查看备份文件结构

$ tree /data/pgbackrest/ -L 3
/data/pgbackrest/
├── archive
│   └── demo
│       ├── 17-1
│       ├── archive.info
│       └── archive.info.copy
└── backup
    └── demo
        ├── 20250618-215005F
        ├── 20250618-215005F_20250618-215632D
        ├── 20250618-215005F_20250618-215953D
        ├── 20250618-215005F_20250618-220716I
        ├── backup.history
        ├── backup.info
        ├── backup.info.copy
        └── latest -> 20250618-215005F_20250618-220716I

恢复操作

参考:pgBackRest - Command Reference

恢复方式非常多,此处只列举三种方式

  • 直接恢复
  • 恢复指定备份
  • PITR(指定时间点恢复)

注:恢复前必须先停止 PG

停止 PG

停止 PG

systemctl stop postgresql-${PG_MAJOR_VERSION}

迁移当前的数据目录(可选)

sudo -iu postgres mv ${PGDATA} ${PGDATA}-bak-$(date +"%Y%m%d-%H%M")

创建新数据目录

sudo -iu postgres mkdir -p ${PGDATA}

直接恢复(推荐)

注:默认直接恢复(等同于 --set=latest--type=default--target-action=promote)会自动选择最新的可用备份,恢复到 WAL 流末尾,并自动增加 timeline

sudo -iu postgres pgbackrest --stanza=demo restore 

# 输出如下信息
2025-06-19 01:09:37.504 P00   INFO: restore command begin 2.55.1: --exec-id=47225-0a613290 --log-level-console=info --log-level-file=detail --pg1-path=/data/pgsql/17 --repo1-cipher-pass=<redacted> --repo1-cipher-type=aes-256-cbc --repo1-path=/data/pgbackrest --repo1-type=posix --stanza=demo
2025-06-19 01:09:37.527 P00   INFO: repo1: restore backup set 20250618-215005F_20250618-220716I, recovery will start at 2025-06-18 22:07:16
2025-06-19 01:09:39.849 P00   INFO: write updated /data/pgsql/17/postgresql.auto.conf
2025-06-19 01:09:39.853 P00   INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
2025-06-19 01:09:39.854 P00   INFO: restore size = 75.0MB, file total = 2082
2025-06-19 01:09:39.854 P00   INFO: restore command end: completed successfully (2356ms)

恢复指定备份

查看备份

sudo -iu postgres pgbackrest --stanza=demo info

指定备份恢复

sudo -iu postgres pgbackrest \
    --stanza=demo \
    --set=20250618-215005F_20250618-215632D \
    --type=immediate \
    --target-action=promote \
    restore 
    
# 默认 --type=immediate 时,会保留 recovery.signal,使用 --target-action=promote 可以直接切换时间线

PITR

参考:pgBackRest User Guide - RHEL

sudo -iu postgres pgbackrest \
    --stanza=demo \
    --type=time \
    --target="2025-06-18 21:57:00+08" \
    --target-timeline=1 \
    --target-action=promote \
    --log-level-console=detail \
    restore

# 注:此处指定时间线 --target-timeline=1。因为前面已经做了多次恢复,指定时间线防止出现恢复截止错误: < FATAL:  recovery ended before configured recovery target was reached > 
# 正常情况下 --target-timeline=latest


# 默认 --type=time 时,会保留 recovery.signal,使用 --target-action=promote 可以直接切换时间线

启动数据库

systemctl start postgresql-${PG_MAJOR_VERSION}

监控

参考:pgBackRest User Guide - RHEL

pgbackrest 可以以 JSON 格式输出有关存储库的信息,包括每个 stanza 的所有备份列表和 WAL 归档信息

示例

PostgreSQL 的 COPY 命令允许将 pgBackRest 信息加载到表中。该示例将此逻辑封装在一个函数中,该函数可用于执行实时查询

创建 SQL 文件

mkdir -p /data/pgsql/sql/


# 信息监控 SQL
$ vim /data/pgsql/sql/pgsql-pgbackrest-info.sql
 
-- An example of monitoring pgBackRest from within PostgreSQL
--
-- Use copy to export data from the pgBackRest info command into the jsonb
-- type so it can be queried directly by PostgreSQL.

-- Create monitor schema
create schema monitor;

-- Get pgBackRest info in JSON format
create function monitor.pgbackrest_info()
    returns jsonb AS $$
declare
    data jsonb;
begin
    -- Create a temp table to hold the JSON data
    create temp table temp_pgbackrest_data (data text);

    -- Copy data into the table directly from the pgBackRest info command
    copy temp_pgbackrest_data (data)
        from program
            'pgbackrest --output=json info' (format text);

    select replace(temp_pgbackrest_data.data, E'\n', '\n')::jsonb
      into data
      from temp_pgbackrest_data;

    drop table temp_pgbackrest_data;

    return data;
end $$ language plpgsql;




# 查询 SQL
$ vim /data/pgsql/sql/pgsql-pgbackrest-query.sql

-- Get last successful backup for each stanza
--
-- Requires the monitor.pgbackrest_info function.
with stanza as
(
    select data->'name' as name,
           data->'backup'->(
               jsonb_array_length(data->'backup') - 1) as last_backup,
           data->'archive'->(
               jsonb_array_length(data->'archive') - 1) as current_archive
      from jsonb_array_elements(monitor.pgbackrest_info()) as data
)
select name,
       to_timestamp(
           (last_backup->'timestamp'->>'stop')::numeric) as last_successful_backup,
       current_archive->>'max' as last_archived_wal
  from stanza;

授权

chown -R postgres:postgres /data/pgsql/sql/

运行 SQL

sudo -iu postgres \
    psql -f /data/pgsql/sql/pgsql-pgbackrest-info.sql

检验

现在可以使用 monitor.pgbackrest_info() 函数来确定某个配置段的最后一次成功备份时间和归档的 WAL

sudo -iu postgres psql -f \
       /data/pgsql/sql/pgsql-pgbackrest-query.sql

# 输出如下信息
  name  | last_successful_backup |    last_archived_wal     
--------+------------------------+--------------------------
 "demo" | 2025-06-18 22:07:18+08 | 00000006000000000000000D
(1 row)

评论