目标
为修一张表而恢复整个集群,会赔上备份之后的全部写入。外科手术路径更便宜也更安全:pg_restore 能从自定义格式归档把单表抽到临时库,在那里核对、与受损数据对比,然后只把受影响行搬回生产。生产环境的其余一切照常运转,因为对它们而言什么都没发生。
步骤要点
- pg_restore –list 检查归档中 invoices 的 TABLE DATA 条目与 dump id,确认可抽取。
- 建临时库并 –table=invoices 只恢复该表及其依赖,归档中其他对象全部跳过。
- 在临时库核对行数与关键列 md5 校验和,确认抽取完整无损。
- 在生产统计 amount=0 的行数,量化坏迁移的实际爆炸半径,明确需要搬回的范围。
- 单事务内 UPDATE … FROM restored 只回填受损行,未受波及的行保留生产最新状态。
排错提示
归档里缺表说明备份时被过滤了,找更早的完整归档,或整库恢复到 scratch 再抽取;pg_restore 因依赖对象失败就把被引用表也加进 –table 列表,或先 –schema-only 后灌数据;修复时外键报错就按依赖顺序处理,或在事务内 SET CONSTRAINTS ALL DEFERRED。
适用边界
逻辑备份只能恢复到备份时刻:其他表此后的写入得以保留,但该表此后的写入会丢;单表外科手术依赖行级可修补,整表替换会丢掉备份后的一切变更。
代码示例
# What is in the archive?
pg_restore --list backup.dump | grep "TABLE DATA" | grep invoices
# Extract only that table
createdb scratch_restore
pg_restore -d scratch_restore --table=invoices backup.dump