内容提要
本文介绍PostgreSQL数据库因磁盘损坏导致数据字典损坏的恢复案例。数据库版本9.5,磁盘每256K丢失数据,导致pg_type和pg_attribute表损坏,无法解析列类型。通过从其他版本复制pg_type数据并手动修补,成功解析出122个表,但仅57个表有完整列信息,恢复率不足50%,客户最终放弃恢复,选择从备份还原。
延伸解读
数据字典损坏的连锁反应
本案例中,磁盘损坏导致pg_type和pg_attribute表的部分数据页丢失。pg_attribute中的atttypid字段存储的是类型ID,而非类型名称,需要与pg_type中的oid关联才能解析出列类型。当pg_type中基础类型(如varchar、date、timestamp)的ID所在数据页丢失时,PDU无法匹配类型,进而导致解析失败。这体现了数据字典表之间紧密的依赖关系,一个表的损坏可能引发连锁反应。
恢复率不足50%的决策参考
案例中,从pg_class解析出122个表,但只有57个表有完整列信息,恢复率约46%。客户最终放弃恢复,选择从备份还原。这提示在实际恢复场景中,当数据字典损坏导致大量表无法恢复时,应评估恢复成本与备份可用性。若恢复率过低,从备份还原可能更高效、更可靠。
跨版本复制数据字典的可行性
作者发现PostgreSQL各版本中基础类型在pg_type中的ID似乎相同,因此从其他版本复制pg_type数据来修补损坏部分。这一方法在特定场景下可行,但需注意仅适用于基础类型,且需谨慎验证。对于自定义类型或跨大版本差异,此方法可能不适用,需结合实际情况判断。
Q&A
PostgreSQL数据字典损坏时如何恢复?
本文介绍了一个真实案例,通过从其他版本的PostgreSQL复制pg_type数据并手动修补,解决了因磁盘损坏导致的数据字典损坏问题,从而能够解析出部分表。
PostgreSQL 9.5数据库因磁盘损坏无法打开,有哪些恢复手段?
案例中使用了PDU工具尝试解析数据字典,但因pg_type和pg_attribute损坏而失败。后来通过从其他版本复制pg_type数据并手动修补,成功解析出122个表,但仅57个表有完整列信息,恢复率不足50%,最终客户选择从备份还原。
PostgreSQL数据字典损坏的常见原因是什么?
常见原因包括磁盘损坏,如案例中每256K丢失数据,导致pg_type和pg_attribute等字典表损坏。
pg_type和pg_attribute在PostgreSQL中分别存储什么信息?
pg_type存储数据类型信息,包括类型名称(typname)和类型ID(oid);pg_attribute存储表的列信息,包括列名(attname)和列类型ID(atttypid),atttypid对应pg_type中的oid。
PostgreSQL中pg_type的oid在不同版本间是否一致?
根据案例,基本类型的ID在PostgreSQL各版本中似乎相同,因此可以从其他版本复制pg_type数据来修补损坏的字典。
PostgreSQL数据字典损坏后,恢复率通常如何?
案例中恢复率不足50%,只有57个表有完整列信息,其余表因列信息丢失无法恢复。
PostgreSQL数据字典损坏时,是否应该选择从备份恢复?
案例中客户在得知恢复率不足50%后,选择放弃恢复,从备份还原。这表明当恢复率过低时,从备份恢复可能是更优选择。