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/
,如需转载,请注明出处,否则将追究法律责任。