首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL 逻辑恢复演练:出错停止、空库重试与业务验收

PostgreSQL 逻辑恢复演练:出错停止、空库重试与业务验收

原创
作者头像
一只特立独行的兔先生
发布于 2026-10-20 11:44:28
发布于 2026-10-20 11:44:28
90
举报

结论:备份能下载,不代表恢复能交付

为腾讯云 PostgreSQL 做逻辑恢复演练时,最容易遗漏的不是导出命令,而是恢复失败之后目标库处于什么状态。pg_restore 默认遇到 SQL 错误会继续处理,最后汇总错误数;如果只看末尾几行进度,可能把部分恢复当作完成。

本文采用一个保守流程:自定义格式导出、独立空库恢复、出错停止、业务验收后再讨论切换。以下是操作模板,不是生产环境实测报告;主机、账号、库名需要替换,先在隔离环境演练。

一、先确定手里是什么备份

腾讯云官方恢复文档区分了物理备份恢复和手动逻辑导出。不要把控制台下载的物理备份直接交给 pg_restore。

  • pg_dump -Fc 生成自定义格式归档,对应 pg_restore。
  • 纯文本 SQL 导出通常交给 psql。
  • 物理备份按产品对应的物理恢复流程处理。

建议源库、目标库和客户端先采用相同 PostgreSQL 大版本,减少兼容性变量。跨版本迁移必须额外核对扩展、排序规则与目标版本兼容性;“工具较新”并不代表任意方向都能恢复。

准备一台能访问两个实例的受控主机。仅放行必要网络来源,密码使用交互提示或权限受限的密码文件,不写进命令行、脚本仓库和文章截图。归档包含业务数据,也应限制访问并按计划清理。

二、导出后先检查目录,但不要把它当作验收

下面命令使用 Bash;执行前确认连接参数和备份目录。目标恢复账号需要具有创建相关对象的权限。

代码语言:bash
复制
set -euo pipefail
umask 077

pg_dump --version
pg_restore --version

pg_dump -h SOURCE_HOST -p 5432 -U SOURCE_USER \
  -d SOURCE_DB -Fc -f backup.dump

pg_restore --list backup.dump > backup.toc

--list 能检查归档目录是否可读,并帮助核对是否包含预期表、序列、索引等条目,但它没有执行建表、加载数据和建立约束,不能证明整份归档能够成功恢复。

pg_dump 面向单个数据库,不负责完整复制集群角色等全局对象。恢复前应列出业务角色、扩展及其版本、权限和外部依赖,明确哪些由平台提供、哪些需要单独创建。

三、恢复到新库,明确失败语义

先创建专用空库 restore_drill,核对字符集、排序规则及所需扩展是否兼容。不要指向生产业务库,也不要为了消除“对象已存在”而直接加 --clean。

代码语言:bash
复制
pg_restore -h TARGET_HOST -p 5432 -U TARGET_USER \
  -d restore_drill \
  --no-owner --no-acl \
  --exit-on-error --verbose \
  backup.dump 2> restore.log

这组参数表达的是明确的权限决策:不复用源端对象所有者与授权,而由恢复账号持有新建对象,之后按目标环境重新授权。它不是“自动修复权限”;遗漏授权会使应用在验收时失败,源库若使用行级安全,还需单独检查策略及其角色依赖。

--exit-on-error 只保证遇到错误就停止,不保证前面已完成的操作回滚。失败后应保留日志,修复缺少扩展、权限不足等根因,再使用另一个新建空库重做,不要在半成品上反复导入。

若恢复规模和资源允许,可改用 --single-transaction,将本次恢复放在一个事务里;它隐含出错停止。代价是长事务与锁资源压力,而且不能与并行恢复 --jobs 同用。不要为了追求原子性,无评估地把超大库塞进单事务。

四、验收要从对象走到业务

恢复命令返回成功只是第一关。建议按下面顺序验收:

  1. 检查日志和退出码,确认没有忽略错误。
  2. 核对关键表、索引、约束、扩展与序列是否齐全。
  3. 对关键表执行行数、金额汇总或业务分区范围校验。
  4. 使用应用实际账号验证查询与授权,并在隔离库验证新增记录、默认值及唯一约束。
  5. 更新统计信息,再执行代表性查询,观察执行计划与耗时。

示例统计信息更新命令如下;它会实际连接目标库,执行前再次确认地址:

代码语言:bash
复制
psql -h TARGET_HOST -p 5432 -U TARGET_USER \
  -d restore_drill -v ON_ERROR_STOP=1 -c 'ANALYZE;'

比对数据时还要统一时间口径。源库持续写入时,恢复结果对应导出快照,不能直接要求它等于源库“此刻”的行数。可以在停写窗口比对,或使用经确认不再变化的历史分区;单独执行的源端统计查询也不天然与导出共享快照。

五、演练成功不等于可以直接切换

逻辑导出并不会持续追平后续写入。业务不能接受导出和恢复期间的停写时,需要另行评估具备增量同步能力的迁移方案,而不是恢复完成后立刻修改连接串。

最终交付物应包含归档来源、导出时间、工具版本、恢复参数、实际耗时、验收口径和权限变更清单。最重要的判断不是“文件有多大”,而是“能否在可接受时间内恢复出可验证、可访问且符合业务时间边界的数据”。

参考文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 结论:备份能下载,不代表恢复能交付
  • 一、先确定手里是什么备份
  • 二、导出后先检查目录,但不要把它当作验收
  • 三、恢复到新库,明确失败语义
  • 四、验收要从对象走到业务
  • 五、演练成功不等于可以直接切换
  • 参考文档
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档