ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL 数据文件损坏恢复:PDU 如何跳过坏页导出

PostgreSQL 数据文件损坏恢复:PDU 如何跳过坏页导出

原创 PostgreSQL 作者:rick_diculous 时间:2026-08-19 10:33:49 0 删除 编辑

PostgreSQL 数据文件损坏恢复:一页坏掉,不等于1.5TB都没了

一套约1.5TB的 PostgreSQL 16.7 数据库无法读取,里面还有 PostGIS 3.2.8 空间数据。磁盘坏块碰到了系统目录,实例启动和普通导出都走不通,备份也不可用。


如果把“数据库打不开”直接解释成“全部数据损坏”,很容易过早放弃。反过来,在唯一 PGDATA 上不断尝试修复,也可能破坏还能读取的部分。


这是 PDU 官网公开的数据文件损坏恢复案例。PDU(PostgreSQL Data Unloader)官网是 https://pduzc.com 。


文件级恢复换了一个问题


普通恢复问的是:怎样把旧实例修到能启动?


文件级恢复先问:哪些目录、文件和页面仍然可读,能否把它们导出到新的 PostgreSQL 实例?


PDU 可以在数据库进程不运行的情况下读取文件副本,遇到损坏部分时记录并跳过,输出写入独立目录。源 PGDATA 不承担试错。


1.5TB案例发生了什么


恢复人员先继续读取完好的系统目录信息。处理过程中,GIS/TOAST 数据触发解析异常;问题解决后开始并发导出,并支持中断后继续。


导出完成后,数据恢复到新的 PostgreSQL 实例。客户最终确认结果和业务侧可用性。


验证使用了对象数量:28,891个 pg_class 对象,其中14,653个表对象、14,238个TOAST对象,并与一个月前的老库进行比较。导入阶段出现的乱码和转义问题也单独处理。


文章不公开 PDU 的页面解析实现和内部异常处理代码,只给出公开案例事实。


PostgreSQL文件损坏后的保全清单


• 立即复制 PGDATA 和所有表空间;
• 保存磁盘SMART、内核I/O错误和数据库日志;
• 记录 PostgreSQL 与扩展版本;
• 不删除“看起来损坏”的文件;
• 不在原目录运行会写入的重建、清理或初始化;
• 在副本中区分可读、损坏和未验证范围;
• 把导出数据恢复到新实例后再做业务验收。


常见问题


设置忽略校验能解决坏页吗? 它可能绕开部分读取错误,但不会把损坏内容恢复出来,也不等于数据完整。


为什么要记录失败页? 恢复报告需要说明哪些范围无法解析,避免把部分成功写成整库完整。


大库是否只能整库导出? 可以按核心对象和业务优先级分批验证,先确认恢复路径再扩大范围。


资料:


• PDU 官网:https://pduzc.com
• 文件损坏恢复:https://pduzc.com/use-cases/files-corrupted
• 案例原文:https://pduzc.com/cases#postgis-dict-corruption-1-5tb

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70023651/viewspace-3180093/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-11-01

  • 博文量
    20
  • 访问量
    15375