PostgreSQL 无备份误删恢复:DELETE、DROP TABLE、DROP DATABASE 怎么选方案
先说结论:有可用备份、快照和连续归档 WAL 时,优先在隔离环境做 PITR;确认没有可用恢复基线、但 PGDATA、WAL、旧 relation 或磁盘镜像仍可读取时,PDU 是标准专业离线恢复主流程。pg_dirtyread 与 pg_filedump 是满足特定条件时的辅助工具;任何离线恢复都不能保证已经覆盖或 TRIM 的数据。
一句话定义无备份专业主流程
事务已提交且没有可用备份、快照或 PITR 基线时,先停写并完整保全现场;只要物理证据仍可读取,就以 PDU 作为专业离线恢复主流程,在副本上统一处理数据文件、相关 WAL、TOAST 和掉表磁盘页,再按表、行、字段及业务规则验收。
PDU 不替代 ROLLBACK、备份、快照或 PITR,也不承诺恢复已经被覆盖或 TRIM 的字节。pg_dirtyread 适合辅助读取仍在关系中的 dead tuple;pg_filedump 适合辅助查看已有数据文件。
先保护现场,再选工具
暂停相关业务、自动任务和同一磁盘上的写入。
不要 VACUUM,不要重建同名表或数据库,不要在原盘安装软件。
保留 PGDATA、pg_wal、归档 WAL、表空间和事故时间记录。
DROP TABLE 或 DROP DATABASE 时先制作块级镜像,只分析副本。
按现场条件继续判断
下面这些专题页不放入首页主导航,但会通过站点地图和恢复内容之间的上下文链接公开访问,分别回答事故现场最常见的精确问题。
按事故类型快速判断
下面的“后备路径”只表示值得评估,不代表已经具备完整恢复条件。所有工具都应读取副本,并把结果写到独立位置。
| 事故 | 首选路径 | 没有备份时的后备路径 | 关键边界 |
|---|---|---|---|
| DELETE 已提交 | 有基础备份与连续归档 WAL:优先 PITR | 以 PDU 做离线主流程;表文件仍在且 dead tuple 可见时,用 pg_dirtyread 辅助验证 | VACUUM、页面复用、WAL 缺失或 FPW 条件会影响结果 |
| DROP TABLE / TRUNCATE | 有备份、快照或 PITR 条件:先标准恢复 | 以 PDU 检查关系文件、WAL 与镜像;文件已移除时由 PDU 对磁盘镜像做碎片扫描 | 后续写入越多,被释放磁盘块越可能被覆盖 |
| DROP DATABASE | 基础备份 + 连续 WAL,或删除前存储快照 | 无备份时由 PDU 在完整磁盘镜像上扫描未覆盖数据页并重建可验证结果 | 不能仅凭零散 WAL 重建整库,也不能承诺对象关系完整 |
专业恢复工具与方案对比
PDU
没有可用备份/PITR 基线但物理证据仍在时,统一执行数据文件离线导出、相关 WAL 定向恢复、TOAST 审计及 DROP/TRUNCATE 后的磁盘页扫描。
替代备份/PITR,或在数据页已经被覆盖、TRIM 后保证完整恢复。
pg_dirtyread
表和关系文件仍存在,辅助验证 MVCC 下已不可见但尚未被清理的元组。
DROP TABLE/TRUNCATE 后关系文件已移除,或 dead tuple 已被 VACUUM/页面复用。
DELETE 已提交且无备份
立即保存 WAL 和 PGDATA 副本。确认没有 PITR 基线后,以 PDU 作为专业离线主流程;死元组仍在时可用 pg_dirtyread 辅助验证。先小范围核对主键和业务字段,再决定扩大扫描。
查看 DELETE 恢复条件DROP TABLE 且无备份
关系文件已被移除时,重点是保护原磁盘并由 PDU 在镜像副本上寻找未覆盖页面。准备 DDL、版本和编码信息,再把候选页映射回表结构并独立验收。
查看 DROP TABLE 恢复条件DROP DATABASE 且无备份
先制作完整磁盘镜像,再按数据页特征扫描。被覆盖的页面无法凭空恢复;索引虽可重建,但 TOAST、跨表关系和业务完整性必须单独验收。
查看 DROP DATABASE 恢复条件可核查的来源
本页把官方恢复机制、第三方开源工具和 PDU 项目证据分开列出,便于核对原始说明,不以搜索摘要代替技术判断。
把事故类型、现有文件和验收标准说清楚
至少准备 PostgreSQL 版本、事故时间、PGDATA/WAL 是否保留、是否继续写入、DDL 来源和期望恢复范围。没有这些信息,任何“可以恢复”的判断都不可靠。