pgBackRest 备份管理使用指南¶
本文说明如何为 Network Mapping 使用的 PostgreSQL 部署 pgBackRest,并通过系统管理页面 查看备份、手动执行备份、检查 WAL 归档以及查看任务日志。文中的路径、PostgreSQL 版本、 服务账户和存储参数都是示例,上线前必须按实际环境调整。
1. 功能范围¶
当前实现包含:
- pgBackRest stanza 状态和备份集查询;
- 管理员手动执行全量、差异和增量备份;
- 管理员手动执行
check,验证 stanza 和 WAL 归档链路; - 手动任务状态、退出码、标准输出和错误输出;
- 手动任务创建与完成审计;
- 独立于 Web 服务的 systemd 定时备份模板。
当前不包含:
- 在页面中修改 systemd timer 的执行时间;
- 在页面中删除备份集或执行
expire; - 在页面中执行数据库恢复;
- 自动替代恢复演练、仓库异地复制或容量监控。
生产恢复具有覆盖数据的风险,必须在隔离环境验证并经过人工审批,不能通过普通 Web 操作直接执行。
2. 组件和数据来源¶
管理员浏览器
│
▼
Vue 数据备份页面
│ 管理员会话 + CSRF
▼
Network Mapping Actix Web API
│ 固定二进制 + 白名单参数
▼
pgBackRest ───── PostgreSQL 数据目录和 WAL
│
└────────── 备份仓库 repo1(可扩展异地对象存储仓库)
systemd timers ── 直接定时执行 pgBackRest
页面中的“备份集”来自 pgbackrest info --output=json,是仓库实际状态;“手动任务”来自
应用数据库中的 backup_job 表,只记录页面发起的任务。systemd 任务不会出现在手动任务
表中,但它生成的备份会出现在备份集列表。
3. 上线前检查清单¶
开始配置前确认:
- 已知 PostgreSQL 主版本、数据目录、端口和服务账户。
- 已评估数据库大小、每日 WAL 量、备份窗口和恢复目标。
- 备份仓库不位于 PostgreSQL 数据目录内,并有足够空间。
- PostgreSQL 主机和备份仓库时钟已同步。
- pgBackRest 可执行文件由 root 管理,配置、数据目录和仓库对 postgres 可用。
- 已预留独立恢复环境,不能把首次恢复测试直接指向生产数据目录。
可先收集环境信息:
postgres --version
pgbackrest version
sudo -u postgres psql -Atqc "show data_directory; show port; show archive_mode; show archive_command;"
df -h /var/lib/pgbackrest
pgBackRest 与 PostgreSQL 的安装方式因发行版而异。优先使用发行版或 pgBackRest 官方提供的 受支持软件包,并在升级前核对版本变更说明。
4. 配置 pgBackRest¶
4.1 创建目录和权限¶
以下为本地 POSIX 仓库示例:
sudo install -d -o postgres -g postgres -m 0750 /var/lib/pgbackrest
sudo install -d -o postgres -g postgres -m 0750 /var/log/pgbackrest
sudo install -d -o postgres -g postgres -m 0750 /var/spool/pgbackrest
sudo install -d -o root -g postgres -m 0750 /etc/pgbackrest
不要把仓库目录设为所有用户可写。配置中含仓库口令或对象存储凭据时,配置文件建议由
root 拥有、备份执行组只读,例如 0640。
4.2 pgBackRest 配置示例¶
创建 /etc/pgbackrest/pgbackrest.conf:
[global]
repo1-type=posix
repo1-path=/var/lib/pgbackrest
repo1-retention-full=4
repo1-retention-diff=14
repo1-retention-archive=4
repo1-retention-archive-type=full
compress-type=zst
start-fast=y
archive-async=y
spool-path=/var/spool/pgbackrest
log-path=/var/log/pgbackrest
log-level-console=info
log-level-file=detail
[network_mapping]
pg1-path=/var/lib/postgresql/<version>/main
pg1-port=5432
需要替换:
<version>:实际 PostgreSQL 主版本目录;pg1-path:show data_directory返回的真实数据目录;pg1-port:实际 PostgreSQL 端口;repo1-path:实际备份仓库挂载点;- 保留数量:根据空间预算和恢复窗口计算。
repo1-retention-full=4 表示按全量备份数量保留,不等同于固定保留 28 天。差异、增量备份
以及为恢复所需的 WAL 会受到备份链和归档保留策略共同影响。修改保留参数前,应先检查
现有备份链,并在测试环境验证 expire 的影响。
如使用 S3、MinIO、Azure 或 GCS 等对象存储,应把访问凭据放入受限配置或密钥管理系统, 不要写入本仓库、页面字段、systemd unit 或应用日志。建议至少保留一份与数据库主机故障域 隔离的仓库副本。
4.3 PostgreSQL 连续归档¶
在 postgresql.conf 中配置:
archive_mode = on
archive_command = 'pgbackrest --stanza=network_mapping archive-push %p'
如果 pgBackRest 不使用默认配置文件,需要在归档命令中显式指定:
archive_command = 'pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping archive-push %p'
archive_mode 通常需要重启 PostgreSQL 才能生效。完成重启后再次查询配置,不能只确认文件
内容:
sudo systemctl restart postgresql
sudo -u postgres psql -Atqc "show archive_mode; show archive_command;"
5. 初始化和第一次备份¶
按以下顺序执行:
sudo -u postgres pgbackrest --stanza=network_mapping stanza-create
sudo -u postgres pgbackrest --stanza=network_mapping check
sudo -u postgres pgbackrest --stanza=network_mapping --type=full backup
sudo -u postgres pgbackrest --stanza=network_mapping info
注意事项:
stanza-create要求目标 stanza 的 archive/backup 仓库目录为空,不能把不相关文件放进去;check会核对数据目录、数据库身份、archive_mode和archive_command,并触发 WAL 切换以确认归档文件确实到达仓库;- 首次上线优先执行全量备份,差异和增量备份都依赖已有备份链;
- 必须看到成功的全量备份后再启用定时任务。
JSON 状态可用于与 Web 页面比对:
sudo -u postgres pgbackrest --stanza=network_mapping --output=json info
info 命令能成功运行,不代表 stanza 一定健康。JSON 内的 stanza status.code 仍可能是:
| 状态码 | 含义 | 常见处理 |
|---|---|---|
| 0 | 正常 | 继续检查最近备份时间和任务日志 |
| 1 | stanza 路径不存在 | 检查仓库路径并运行 stanza-create |
| 2 | 没有有效备份 | 完成第一次全量备份 |
| 3 | stanza 元数据缺失 | 检查仓库完整性、权限和初始化步骤 |
| 4 | 多仓库信息不一致 | 分别检查各仓库配置和同步状态 |
| 5 | 数据库身份不匹配 | 确认 pg1-path 指向正确实例,禁止混用旧仓库 |
| 6 | 指定备份不存在 | 核对备份标签和仓库编号 |
| 99 | 其他仓库错误 | 查看详细日志,检查网络、权限和对象存储配置 |
6. 配置 Network Mapping Web 服务¶
在 Network Mapping 的 config.toml 中启用:
[backup]
enabled = true
binary = "/usr/bin/pgbackrest"
stanza = "network_mapping"
config_file = "/etc/pgbackrest/pgbackrest.conf"
run_as_user = "postgres"
sudo_binary = "/usr/bin/sudo"
command_timeout_seconds = 21600
max_output_bytes = 1048576
参数说明:
| 参数 | 说明 |
|---|---|
enabled |
是否开放后端查询和手动操作;默认 false |
binary |
pgBackRest 或经过审计的本机代理绝对路径 |
stanza |
允许管理的固定 stanza,只允许字母、数字、下划线和连字符 |
config_file |
pgBackRest 配置文件;可省略以使用其默认搜索路径 |
run_as_user |
可选的固定执行账户;推荐设置为 postgres,设置后使用非交互 sudo |
sudo_binary |
sudo 绝对路径,仅在配置 run_as_user 时使用 |
command_timeout_seconds |
手动备份/check 最大执行时间,超时会终止子进程 |
max_output_bytes |
每个 stdout/stderr 字段最大保存量,超出时保留末尾内容 |
修改后重启 Network Mapping 服务。启动时会自动创建 backup_job 表;升级前仍建议按正常
流程备份应用数据库。
6.1 推荐权限模型¶
仓库已经提供可直接落地的 sudo 模式,不需要让 Network Mapping 读取 PostgreSQL 数据目录, 也不需要把 Web 服务改成 root 或 postgres:
network-mapping 服务账户
│ 只能提交五条完全固定的 sudoers 命令
▼
sudo -n -u postgres -- /usr/bin/pgbackrest <固定参数>
│
▼
postgres 账户读取数据目录、pgBackRest 配置和仓库
当 run_as_user = "postgres" 时,后端实际生成的命令前缀固定为:
/usr/bin/sudo -n -u postgres -- /usr/bin/pgbackrest
-n 表示非交互模式;如果 sudoers 不允许或仍要求密码,命令会立即失败,不会让 Web
请求卡在密码提示。后端仍只生成以下五种 pgBackRest 参数组合:
--config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --output=json info
--config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping check
--config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=full backup
--config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=diff backup
--config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=incr backup
run_as_user 不允许设置为 root,也不接受空格、#0 或命令行片段。Web 请求不能覆盖
binary、sudo_binary、run_as_user、config_file 或 stanza。
6.2 安装精确 sudoers 规则¶
以下步骤假设:
- Network Mapping systemd 服务账户是
network-mapping; - pgBackRest 运行账户是
postgres; - 二进制为
/usr/bin/pgbackrest; - 配置为
/etc/pgbackrest/pgbackrest.conf; - stanza 为
network_mapping。
先确认实际值:
systemctl show network-mapping-server.service -p User -p Group -p NoNewPrivileges
command -v sudo
command -v pgbackrest
id network-mapping
id postgres
如果该 unit 显示 NoNewPrivileges=yes,set-user-ID sudo 无法切换到 postgres。不要盲目关闭
这项防护;应由安全管理员在“保留 NoNewPrivileges 并部署只暴露固定操作的本机代理”
和“对该 unit 允许精确 sudoers 桥接”之间做明确选择。本节的 sudo 方案要求
NoNewPrivileges=no。
如果服务账户尚未创建,应在安装 Network Mapping 服务时创建系统账户,并让应用目录由部署 账户管理、运行所需文件只读。示例:
sudo useradd --system --home-dir /var/lib/network-mapping --create-home \
--shell /usr/sbin/nologin network-mapping
账户已存在时不要重复执行 useradd。如果实际账户或路径不同,必须同时修改
config.toml 和 deploy/sudoers/network-mapping-pgbackrest,不能只改一边。
先检查仓库提供的规则:
sudo visudo -cf deploy/sudoers/network-mapping-pgbackrest
确认输出 parsed OK 后安装:
sudo install -o root -g root -m 0440 \
deploy/sudoers/network-mapping-pgbackrest \
/etc/sudoers.d/network-mapping-pgbackrest
sudo visudo -cf /etc/sudoers.d/network-mapping-pgbackrest
sudo visudo -c
模板使用完整命令和完整参数,不包含 *、目录授权、正则表达式或 shell:
Cmnd_Alias NM_PGBACKREST = \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --output=json info, \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping check, \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=full backup, \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=diff backup, \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping --type=incr backup
network-mapping ALL=(postgres) NOPASSWD: NM_PGBACKREST
sudoers 在规则中指定参数时,请求参数必须匹配;如果不写参数,则意味着该命令可携带任意 参数。因此不能简化成下面任何一种形式:
# 错误:允许 pgBackRest 的任意命令和参数,包括 restore 和其他配置路径
network-mapping ALL=(postgres) NOPASSWD: /usr/bin/pgbackrest
# 错误:参数通配符会跨空格匹配,边界比看起来更宽
network-mapping ALL=(postgres) NOPASSWD: /usr/bin/pgbackrest *
# 错误:允许直接获得 postgres shell
network-mapping ALL=(postgres) NOPASSWD: /bin/sh
6.3 正向和反向验证¶
查看服务账户实际获得的权限:
sudo -l -U network-mapping
以服务账户测试页面查询所需的精确命令:
sudo -u network-mapping sudo -n -u postgres -- \
/usr/bin/pgbackrest \
--config=/etc/pgbackrest/pgbackrest.conf \
--stanza=network_mapping \
--output=json info
再测试 check;它会触发 WAL 切换,应在允许的维护窗口执行:
sudo -u network-mapping sudo -n -u postgres -- \
/usr/bin/pgbackrest \
--config=/etc/pgbackrest/pgbackrest.conf \
--stanza=network_mapping \
check
还必须确认下面三种越权尝试全部被 sudo 拒绝:
# 修改 stanza:必须失败
sudo -u network-mapping sudo -n -u postgres -- \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=other info
# 执行 restore:必须失败
sudo -u network-mapping sudo -n -u postgres -- \
/usr/bin/pgbackrest --config=/etc/pgbackrest/pgbackrest.conf --stanza=network_mapping restore
# 获取 shell:必须失败
sudo -u network-mapping sudo -n -u postgres -- /bin/sh -c id
拒绝时 sudo 应返回非零退出码并记录 not allowed to execute 或等效信息。如果任意负向测试
成功,立即删除或禁用该 sudoers 规则并重新检查,不要启用 Web 备份。
6.4 文件权限和启动验证¶
使用 sudo 模式时,Network Mapping 服务账户只需要执行 /usr/bin/sudo;pgBackRest 配置、
PostgreSQL 数据目录和备份仓库继续只授权给 postgres:
sudo chown root:postgres /etc/pgbackrest/pgbackrest.conf
sudo chmod 0640 /etc/pgbackrest/pgbackrest.conf
sudo chown -R postgres:postgres /var/lib/pgbackrest /var/log/pgbackrest /var/spool/pgbackrest
sudo chmod 0750 /var/lib/pgbackrest /var/log/pgbackrest /var/spool/pgbackrest
最后重启 Network Mapping,进入数据备份页面。页面应显示“sudo → postgres”,能够刷新状态 并运行检查;标准错误中不应出现密码提示。
7. 安装定时任务¶
仓库的 deploy/systemd/ 提供以下模板:
| Unit | 默认时间 | 操作 |
|---|---|---|
pgbackrest-backup-full.timer |
周日 02:10 | 全量备份 |
pgbackrest-backup-diff.timer |
周一至周六 02:10 | 差异备份 |
pgbackrest-backup-incr.timer |
每天 08:10、14:10、20:10 | 增量备份 |
pgbackrest-check.timer |
每天 01:30 | stanza/WAL 归档检查 |
安装前先打开 unit 文件,确认 User、Group、stanza、二进制和时间符合当前环境。然后执行:
sudo install -m 0644 deploy/systemd/pgbackrest-* /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now \
pgbackrest-backup-full.timer \
pgbackrest-backup-diff.timer \
pgbackrest-backup-incr.timer \
pgbackrest-check.timer
验证 timer:
systemctl list-timers 'pgbackrest-*'
systemctl status pgbackrest-backup-full.timer
systemctl status pgbackrest-check.timer
修改 OnCalendar 后,可在安装前检查表达式:
systemd-analyze calendar 'Sun *-*-* 02:10:00'
systemd-analyze verify deploy/systemd/pgbackrest-*.service deploy/systemd/pgbackrest-*.timer
Persistent=true 会在主机错过触发时间后补跑。RandomizedDelaySec=5m 会把实际开始时间在
五分钟内随机错开,因此日志时间可能不是精确的 02:10。
手动验证一次 systemd 服务:
sudo systemctl start pgbackrest-check.service
sudo journalctl -u pgbackrest-check.service -n 100 --no-pager
不要在首次验证时直接启动全量 timer;先通过命令行或 Web 明确执行并观察一份全量备份。
8. 使用 Web 数据备份页面¶
管理员登录后进入“系统设置 → 数据备份”。普通用户看不到导航入口,直接访问 API 也会 返回 403。
8.1 页面状态¶
- Stanza:当前后端允许管理的固定 stanza;“命令可用”和 stanza 健康状态应分别看待。
- 最近成功备份:仓库中结束时间最新的备份,不只包含 Web 手动任务。
- 可用备份集:从 pgBackRest 仓库元数据读取的备份数量。
- 任务状态:本实例是否有手动任务执行,以及最近任务失败数量。
- 备份集:定时和手动任务共同产生的实际备份。
- 手动任务:仅页面提交的任务,可打开查看 stdout、stderr 和退出码。
页面每 10 秒自动刷新,也可点击“刷新”。备份运行时不要反复提交;并发请求会返回 409。
8.2 选择备份类型¶
| 类型 | 读取范围 | 典型用途 | 代价 |
|---|---|---|---|
全量 full |
完整数据库集群 | 首次备份、重大变更前、建立新基线 | 时间和空间最大 |
差异 diff |
相对最近全量发生的变化 | 日常备份、恢复链路较短 | 中等 |
增量 incr |
相对最近一次备份发生的变化 | 缩短备份间隔、降低单次写入量 | 恢复依赖链更长 |
推荐操作:
- 首次部署、仓库重建或 PostgreSQL 大版本切换后执行全量备份。
- 发布普通应用版本前可执行增量;涉及大规模数据迁移时优先差异或全量。
- 填写能说明原因的备注,如工单号、发布版本或变更窗口。
- 提交后观察手动任务状态;成功后确认备份集出现新标签。
- 失败时打开任务日志,优先看 stderr 最后部分,不要只重复点击。
8.3 运行检查¶
“运行检查”不创建数据库备份。它用于核对 stanza、数据库配置和 WAL 归档链路。以下情况应 主动执行:
- 首次部署和修改 pgBackRest/PostgreSQL 配置后;
- 更换仓库、凭据、证书或网络策略后;
- 发现 WAL 归档告警或备份等待归档超时后;
- 恢复演练前后。
检查成功不能替代备份和恢复演练,只说明当前检查链路工作正常。
9. 日常运行建议¶
每日¶
- 查看最近备份时间是否满足 RPO;
- 确认最近定时任务没有失败;
- 关注 WAL 归档错误和仓库剩余空间。
每周¶
- 确认至少有一份新的全量备份;
- 执行或检查
check结果; - 检查 systemd timer 的下一次触发时间和失败计数。
每月或每季度¶
- 在隔离环境执行一次真实恢复;
- 记录恢复耗时、恢复到的数据时间点和业务校验结果;
- 复核保留策略是否覆盖审计、合规和事件调查窗口;
- 可按部署版本评估运行
pgbackrest verify对仓库做更完整的校验。
10. 隔离恢复演练¶
以下命令只能在隔离恢复主机执行。目标 PostgreSQL 必须停止,目标数据目录必须为空且权限 正确。先在源环境记录备份标签:
sudo -u postgres pgbackrest --stanza=network_mapping info
在隔离环境恢复最新备份:
sudo systemctl stop postgresql
sudo install -d -o postgres -g postgres -m 0700 /srv/postgresql-restore
sudo -u postgres pgbackrest \
--stanza=network_mapping \
--pg1-path=/srv/postgresql-restore \
restore
恢复指定备份标签:
sudo -u postgres pgbackrest \
--stanza=network_mapping \
--pg1-path=/srv/postgresql-restore \
--set=<backup-label> \
restore
指定时间点恢复示例:
sudo -u postgres pgbackrest \
--stanza=network_mapping \
--pg1-path=/srv/postgresql-restore \
--type=time \
--target='2026-08-22 10:30:00+08:00' \
--target-action=promote \
restore
时间点必须带明确时区,并且仓库中必须存在覆盖目标时间的基础备份和 WAL。pgBackRest 可根据
目标时间选择合适备份,也可以用 --set 明确指定。多仓库部署还应明确测试从异地仓库恢复。
恢复后使用隔离端口启动 PostgreSQL,至少检查:
- PostgreSQL 能正常进入可读写状态;
- 关键表存在且数量合理;
- Network Mapping 能在隔离配置下登录和查询;
- 恢复时间点符合预期;
- 实际 RTO 是否达标。
不要把恢复演练的 pg1-path 指向生产数据目录,也不要为节省空间复用生产端口或生产应用
配置。
11. 常见问题排查¶
页面提示“管理功能未启用”¶
检查 Network Mapping config.toml 中 [backup].enabled 是否为 true,并确认修改的是
服务实际使用的配置文件。重启服务后查看启动日志中的 backup 配置摘要。
页面提示无法执行 pgBackRest¶
先确认页面显示的执行模式。使用本文推荐的 run_as_user = "postgres"
时,应在 Network Mapping 服务账户下测试与后端完全相同的命令:
sudo -u network-mapping sudo -n -u postgres -- \
/usr/bin/pgbackrest \
--config=/etc/pgbackrest/pgbackrest.conf \
--stanza=network_mapping \
--output=json info
处理顺序:
- 如果 sudo 返回“password is required”或“not allowed”,运行
sudo visudo -cf /etc/sudoers.d/network-mapping-pgbackrest并核对服务账户、二进制路径、 config、stanza、参数和顺序。 - 如果 sudo 报“no new privileges”,检查 systemd unit 的
NoNewPrivileges,按 6.2 节选择 本机代理或精确 sudoers 桥接。 - 如果 sudo 已允许,但 pgBackRest 返回 permission denied,检查 postgres 对配置、 数据目录、spool、日志、仓库和远端存储的访问。
- 如果命令行成功而页面失败,确认 systemd 服务实际读取的
config.toml,然后 重启后端并查看任务 stderr。
不要为了消除权限错误把服务改为 root,也不要将 sudoers 改成任意参数。
stanza 显示 no valid backups¶
说明 stanza 元数据可读取但没有有效备份。完成一次全量备份,再刷新页面。
database mismatch / pg1-path 错误¶
立即停止继续写入该仓库,核对 show data_directory、PostgreSQL system-id 和 pgBackRest
配置。不要对旧集群仓库重复执行 stanza-create 来掩盖问题。
check 报 archive timeout¶
检查:
archive_mode和archive_command的实际运行值;- PostgreSQL 日志中的 archive command 失败;
- pgBackRest archive-push 日志;
- spool、仓库目录权限;
- 对象存储 DNS、TLS、凭据和防火墙。
页面返回 409¶
已有 queued/running 手动任务。等待其结束并刷新页面。如果服务异常重启,启动恢复逻辑会把 中断任务标为失败;仍需确认操作系统中没有其他 pgBackRest/systemd 任务运行。
任务长时间执行¶
先查看任务 stderr、pgBackRest 文件日志和 systemd journal。pgBackRest 锁文件包含进程和 阶段性进度信息,可用于判断是否仍在推进。不要直接删除锁文件或强制终止进程;先确认进程 状态、仓库 I/O、数据库负载和网络状况。
定时备份没有出现在“手动任务”¶
这是预期行为。systemd 直接运行 pgBackRest,不写 backup_job 表。检查“备份集”是否出现
新标签,并通过 journalctl -u pgbackrest-backup@full.service 等命令查看 systemd 日志。
Web 任务日志不完整¶
每个 stdout/stderr 字段受 max_output_bytes 限制,超出时只保留末尾内容。完整日志应在
pgBackRest log-path 或 systemd journal 中查看。
12. 安全和变更要求¶
- 仅管理员可以访问备份 API,所有写操作受 CSRF 中间件保护。
- 不在页面、Git、systemd unit 或审计事件中保存仓库密钥。
- 配置文件和仓库目录使用最小权限,Network Mapping 服务不以 root 运行。
- 修改 stanza、仓库地址、加密口令、保留策略或 timer 前先备份配置并记录变更。
- 多仓库和对象存储配置必须验证 TLS、凭据轮换、网络故障和异地恢复。
- 备份成功、
check成功和verify成功都不能替代真实恢复。
13. 停用定时任务¶
需要暂停计划任务时,只停用 timer,不要删除仓库:
sudo systemctl disable --now \
pgbackrest-backup-full.timer \
pgbackrest-backup-diff.timer \
pgbackrest-backup-incr.timer \
pgbackrest-check.timer
然后确认没有正在运行的服务:
systemctl list-units 'pgbackrest-*'
停用 Web 手动功能可将 [backup].enabled 改为 false 并重启 Network Mapping。删除仓库、
执行 expire 或更换加密口令属于高风险操作,不包含在停用步骤中。
14. 上线验收¶
- [ ]
stanza-create、check和第一次全量备份成功。 - [ ]
info --output=json中 stanza 状态码为 0。 - [ ] 数据备份页面显示“sudo → postgres”,服务本身仍以非 root 账户运行。
- [ ] sudoers 中只有五条完整命令,不包含通配符、脚本或 shell。
- [ ] info 和 check 正向测试成功,更换 stanza、restore 和
/bin/sh反向测试被拒绝。 - [ ] 管理员能打开数据备份页面,普通用户 API 返回 403。
- [ ] 页面能提交一次手动增量或差异备份并查看完整任务结果。
- [ ] 备份成功后,新标签出现在备份集列表。
- [ ] 四个 timer 已启用且下一次触发时间正确。
- [ ] 主机重启后
Persistent=true的行为符合运维预期。 - [ ] 仓库容量和 WAL 增长已纳入监控。
- [ ] 已在隔离环境完成恢复并记录 RPO/RTO。