PostgreSQL备份与恢复验证教程

适用环境:PostgreSQL 14–18 常规业务库;使用与源服务器同主版本的客户端作为起点。本文为逻辑备份,不包含 WAL 连续归档或整个集群的物理恢复。

先明确源数据库、导出账号和独立测试服务器。pg_dump 的自定义格式适合后续查看目录和选择恢复对象,但一个数据库的导出不包含整个集群的角色和表空间配置。将角色、扩展、应用配置等环境资料单独记录。分段命令在同一个Bash会话执行,断开后按记录恢复变量指向的实际路径。

核对连接到哪台数据库

pg_dump --version
psql -h 127.0.0.1 -p 5432 -U app_backup -d example_app -W \
  -c "SELECT current_database(), current_user, version();"

用真实参数替换示例。pg_dump 不能导出比自己主版本更新的服务端;跨主版本恢复还要核对扩展、语法和目标兼容性。示例使用 -W 交互输入密码,不能把密码写进可公开的连接 URI 或截图。导出账号需要读取目标对象,遇到权限不足先补齐被批准的访问范围。

导出一个自定义格式文件

umask 077
dump_dir=$(mktemp -d /var/tmp/baole-pg.XXXXXXXX)
pg_dump -h 127.0.0.1 -p 5432 -U app_backup -W \
  -Fc -f "$dump_dir/example_app.dump" example_app \
  2> "$dump_dir/pg_dump.err"
dump_status=$?
printf 'pg_dump exit=%s\n' "$dump_status"
cat "$dump_dir/pg_dump.err"
pg_restore --list "$dump_dir/example_app.dump" > "$dump_dir/contents.txt"

检查退出码与标准错误。--list 成功说明文件目录可读取,还不能证明每一张表都能恢复。常规导出可获取一致性视图,但长时间任务仍会消耗数据库与磁盘资源;DDL、权限变化、存储或连接问题会造成导出失败。不要把不断出现的警告留到故障时再处理。

在新建的隔离库中试恢复

下面的文档 IP 必须替换为隔离测试机地址。测试服务器应具备需要的扩展,并与生产消息、支付及外部任务隔离。恢复只处理自己信任的归档,因为导入 SQL/对象可能执行代码。

restore_host=203.0.113.30
psql -h "$restore_host" -p 5432 -U restore_user -d postgres -W \
  -c "SELECT current_database(), current_user, version();"

先人工核实这里确实是隔离测试服务器,确认导出文件已经成功完成,再执行下面的新建与恢复步骤。恢复库名必须尚不存在,测试账号需要有创建测试库及恢复相应对象的权限。

if createdb -h "$restore_host" -p 5432 -U restore_user -W baole_restore_check; then
    pg_restore -h "$restore_host" -p 5432 -U restore_user -W \
      --exit-on-error --no-owner --no-privileges \
      -d baole_restore_check "$dump_dir/example_app.dump"
    restore_status=$?
    printf 'pg_restore exit=%s\n' "$restore_status"
    test "$restore_status" -eq 0
else
    printf '%s\n' '新测试库创建失败,未执行恢复。检查错误或换一个新的演练库名。' >&2
    false
fi

库已存在或创建失败时不会进入恢复分支。示例不使用 --clean 或 --create,避免按备份中的旧名称删除或重建其他库。--no-owner、--no-privileges 让这次演练不直接恢复原对象所有者和授权;这并不代表正式迁移可以省略权限设计。需要保留原角色和权限的迁移,应另做匹配的恢复计划。

检查数据、扩展和应用

psql -h "$restore_host" -p 5432 -U restore_user -d baole_restore_check -W -c '\dt'
psql -h "$restore_host" -p 5432 -U restore_user -d baole_restore_check -W -c '\dx'
  • 核对业务 schema、表、视图、函数、序列和扩展;不能只统计 public 下的表。
  • 使用已知业务记录检查文本、时间、附件引用和关键计数,再让隔离应用读取测试库。
  • 如发生扩展缺失或版本不支持,保留原归档,在测试服务器解决兼容问题后从空的新库重新演练。
  • 记录导出和恢复时间、文件大小、SHA256以及所用客户端/服务端版本,再保存异地副本。