postgresql:意外删除了pg_filenode.map

postgresql:意外删除了pg_filenode.map,postgresql,Postgresql,是否有任何方法可以恢复或重新创建意外删除的pg_filenode.map文件?或者,对于如何在不影响数据库的情况下解决此问题,是否有任何解决方案?非常感谢您对解决此问题的任何建议!我们的postgres版本是在RedhatLinux5中运行的9.0。谢谢 立即停止尝试修复任何问题。你做的每件事都有可能让事情变得更糟 将此视为严重的数据库损坏 仅当你遵循了它的建议时,你甚至应该考虑尝试修复或恢复。 由于如果删除的文件尚未被覆盖,您可能有希望恢复该文件,因此还应停止整个服务器机器或卸载Postgre

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

立即停止尝试修复任何问题。你做的每件事都有可能让事情变得更糟

将此视为严重的数据库损坏

仅当你遵循了它的建议时,你甚至应该考虑尝试修复或恢复。

由于如果删除的文件尚未被覆盖,您可能有希望恢复该文件,因此还应停止整个服务器机器或卸载PostgreSQL所在的文件系统,并将其镜像到磁盘上

如果这些数据对您很重要,我建议您联系专业支持。这将使您付出代价,但这可能是在管理员犯了这样严重的错误后,您恢复数据的最佳机会。看见(免责声明:如我的SO简介所示,我为其中一家上市公司工作)


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

首先,如果这是紧急且有价值的工作,我强烈建议首先联系专业支持。但是,如果您可以处理磁盘映像,如果它不是时间关键型的,等等。下面是需要注意的要点以及如何继续(我们最近不得不恢复一个坏的pg_filenode.map。此外,您最好处理磁盘映像的磁盘映像

以下是我从恢复因包含目录写入不完整而损坏的文件中学到的知识。这是PostgreSQL 10的最新版本,但随时都可能更改。

开始之前

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

此文件是什么及其作用

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

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

有几件事可能会更改此映射。如果您对系统目录执行真空完全或类似操作,这可能会更改默认映射,然后从initdb复制到新文件将没有帮助

一些需要尝试的事情

尝试的第一件事(在副本的副本上!)是将该文件替换为来自同一服务器的另一个文件系统(这可能是一个拇指驱动器或任何东西)上的新initdb文件。这可能有效,也可能无效

如果失败了,那么也许可以使用pg_filedump和定制脚本/C编程,在努力查看数据目录中每个关系文件的数据的基础上创建一个新文件。正如Craig所指出的,这将是一项重要的工作

如果你让它发挥作用


对您的数据库进行新的pg_转储,并将其还原到新的initdb中。这样您就知道一切都是一致的和完整的。

还原您的最新备份…您正在运行Red Hat 2.6?这太古老了!抱歉,它的Redhat版本5(2.6.18-194.el5xen)问题是我们没有备份:(显然,你的数据并没有那么重要。