张晨:PostgreSQL数据字典损坏时的恢复方法——一个真实案例研究

张晨:PostgreSQL数据字典损坏时的恢复方法——一个真实案例研究

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

本文介绍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%后,选择放弃恢复,从备份还原。这表明当恢复率过低时,从备份恢复可能是更优选择。

🏷️

标签

➡️

继续阅读