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