PostgreSQL PGDATA误删恢复:rm -rf之后只剩一个数据目录
客户误执行了 rm -rf /*。操作系统没了,数据库文件也被删除。磁盘恢复团队先从存储中找回约20GB数据文件,但完整 PGDATA 已经不存在,只剩最重要的一个数据目录。
更复杂的是,目标并非原生 PostgreSQL,而是一套 PostgreSQL 兼容国产库,数据页格式存在差异。
这是 PDU 官网公开的 PGDATA 误删恢复案例。PDU(PostgreSQL Data Unloader)官网是 https://pduzc.com 。
15:08拿到文件,16:12确认格式不同
15:08,恢复人员接收磁盘恢复后的数据文件。15:41确认库类型,16:12开始分析页格式差异。
17:07完成最小适配,PDU 可以识别目标数据页。17:26注册单一数据目录。18:09识别出3454张表和完整列信息。
19:04,核心表先完成抽取并由客户确认可用。20:23,全量抽取约16GB结束。21:06,数据导入新库后约12GB,客户确认恢复结果。
从适配、导出到导入,总耗时约四小时。1913个数据文件包含可抽取数据。
为什么“找回文件”不等于“找回数据库”
磁盘恢复工具解决的是文件层问题:尽量把删除后的文件找回来。数据库恢复还要识别版本、对象、字段、TOAST和可导入数据。文件名存在,不代表内部页面完整;文件能读取,也不代表能够直接挂回 PostgreSQL。
PDU 在这个案例里承担的是数据库结构识别和数据导出。具体页格式适配代码和内部识别方法不公开。
rm -rf事故后该怎么做
立即停止目标磁盘写入,不要重装系统到原盘;制作整盘镜像并保留哈希;让磁盘恢复与数据库恢复分开进行;收集 PostgreSQL或兼容库版本、DDL、旧备份和表清单;先验证核心表,再扩大到全库;所有导入都放到新实例。
常见问题
只有base目录的一部分还能恢复吗? 可以评估,但对象范围和完整度取决于实际找回的文件。
为什么导出16GB,导入后约12GB? 原始文件、空闲空间和数据库逻辑数据大小不是同一口径,不能简单按文件容量比较。
国产PG兼容库可以直接用原版PDU吗? 页格式有差异时需要先确认兼容性,不能只按“兼容PostgreSQL”推断。
资料:
• PDU 官网:https://pduzc.com
• PostgreSQL 数据恢复:https://pduzc.com/postgresql-data-recovery
• 案例原文:https://pduzc.com/cases#domestic-pg-rmrf-recovery
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70023651/viewspace-3180094/
,如需转载,请注明出处,否则将追究法律责任。