postgresql:意外删除了pg_filenode.map

时间:2013-03-04 08:30:02

标签: postgresql

有没有办法恢复或重新创建意外删除的pg_filenode.map文件?或者是否有任何解决方案如何在不影响数据库的情况下解决此问题?任何解决此问题的建议都非常感谢!我们拥有的postgres版本是在Redhat Linux 5中运行的9.0。谢谢!

2 个答案:

答案 0 :(得分:2)

立即尝试修复任何行为。你做的每件事都有可能使情况变得更糟。

将此视为关键数据库损坏。 Read and act on this wiki article

只有在您遵循其建议后,您才应考虑尝试修复或恢复。

由于你可能有一些希望恢复已删除的文件(如果它还没有被覆盖),你也应该停止整个服务器机器或卸载文件系统PostgreSQL打开并对其进行磁盘映像。

如果这些数据对您很重要,我建议您联系专业支持。这将花费你,但可能是你在这样一个严重的管理员错误后恢复数据的最佳机会。见PostgreSQL professional support。 (免责声明:我为上市公司之一工作,如我的SO资料中所示)。

您可以使用有关表结构和从磁盘表中提取的内容的信息手动重建pg_filenode.map。不过可能是个大工作。

答案 1 :(得分:1)

首先,如果这是紧急且有价值的,我强烈建议您首先与专业支持联系。但是,如果可以在磁盘映像上工作,并且时间不是很紧迫,等等。这里有一些重要的注意事项以及如何进行处理(我们最近不得不恢复一个坏的pg_filenode.map。此外,最好在磁盘映像上进行工作。磁盘映像的磁盘映像。

以下是我从必须恢复损坏的文件中学到的知识,该损坏的文件是由于对包含目录的写入不完整而导致的。 它是PostgreSQL 10的最新版本,但可能随时更改

开始之前

数据恢复是有风险的业务。在开始之前,请始终注意恢复对您的组织意味着什么,可以容忍什么数据丢失,可以容忍什么停机时间等。如果可以,请处理副本的副本。如果有什么不正确的地方,请转回去,评估出了什么问题,并确保在继续之前了解原因。

此文件的用途及其作用

PostgreSQL的标准文件节点映射存储在pg_class关系中,该关系由Pg目录中的对象ID引用。不幸的是,您需要一种引导系统表的映射的方法,以便您可以查找这种信息。

在大多数部署中,永远不会写入此文件。可以从相同版本的Postgres上的新initdb复制该文件,并使用传递到initdb的相同选项(除了数据目录)。但是,这不能保证。

几件事可以更改此映射。如果您对系统目录执行完全清除或类似操作,则可以更改默认映射,然后从initdb复制到新文件中将无济于事。

一些可以尝试的事情

要尝试的第一件事(在副本上!)是将文件从一个新的initdb替换为同一服务器上的另一个文件系统(这可以是拇指驱动器或其他驱动器)。这可能有效。它可能不起作用。

如果失败,则可能有可能使用pg_filedump和自定义脚本/ C编程来创建新文件,这是基于对数据目录中每个关系文件的数据进行浏览的努力。正如Craig上文所述,这将是一项重大工作。

如果可以使用

重新获取数据库的pg_dump并将其还原到新的initdb中。这样,您便知道所有内容都是一致且完整的。