
为腾讯云 PostgreSQL 做逻辑恢复演练时,最容易遗漏的不是导出命令,而是恢复失败之后目标库处于什么状态。pg_restore 默认遇到 SQL 错误会继续处理,最后汇总错误数;如果只看末尾几行进度,可能把部分恢复当作完成。
本文采用一个保守流程:自定义格式导出、独立空库恢复、出错停止、业务验收后再讨论切换。以下是操作模板,不是生产环境实测报告;主机、账号、库名需要替换,先在隔离环境演练。
腾讯云官方恢复文档区分了物理备份恢复和手动逻辑导出。不要把控制台下载的物理备份直接交给 pg_restore。
pg_dump -Fc 生成自定义格式归档,对应 pg_restore。psql。建议源库、目标库和客户端先采用相同 PostgreSQL 大版本,减少兼容性变量。跨版本迁移必须额外核对扩展、排序规则与目标版本兼容性;“工具较新”并不代表任意方向都能恢复。
准备一台能访问两个实例的受控主机。仅放行必要网络来源,密码使用交互提示或权限受限的密码文件,不写进命令行、脚本仓库和文章截图。归档包含业务数据,也应限制访问并按计划清理。
下面命令使用 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。
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 同用。不要为了追求原子性,无评估地把超大库塞进单事务。
恢复命令返回成功只是第一关。建议按下面顺序验收:
示例统计信息更新命令如下;它会实际连接目标库,执行前再次确认地址:
psql -h TARGET_HOST -p 5432 -U TARGET_USER \
-d restore_drill -v ON_ERROR_STOP=1 -c 'ANALYZE;'比对数据时还要统一时间口径。源库持续写入时,恢复结果对应导出快照,不能直接要求它等于源库“此刻”的行数。可以在停写窗口比对,或使用经确认不再变化的历史分区;单独执行的源端统计查询也不天然与导出共享快照。
逻辑导出并不会持续追平后续写入。业务不能接受导出和恢复期间的停写时,需要另行评估具备增量同步能力的迁移方案,而不是恢复完成后立刻修改连接串。
最终交付物应包含归档来源、导出时间、工具版本、恢复参数、实际耗时、验收口径和权限变更清单。最重要的判断不是“文件有多大”,而是“能否在可接受时间内恢复出可验证、可访问且符合业务时间边界的数据”。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。