PostgreSQL-意外删除数据文件后恢复函数代码

PostgreSQL-意外删除数据文件后恢复函数代码,postgresql,function,recover,data-files,Postgresql,Function,Recover,Data Files,所以,我很好。。。我在一个容器Ubuntu14.04LTS中运行PostgreSQL,其中包含所有最新的更新,后端存储是dir,这是因为我相信 长话短说,容器文件夹被删除了。在使用extundelete和ext4magic之后,我成功地提取了一些数据库物理文件,似乎大部分文件都在那里。。。但不能百分之百确定是否遗漏了什么 我有两份数据库文件。一个来自9.5.3,看起来更完整,另一个来自9.6,最近我将容器升级到了9.6,但是它似乎缺少数据文件 我要做的就是尝试并提取与用户定义函数相关的SQL代码

所以,我很好。。。我在一个容器Ubuntu14.04LTS中运行PostgreSQL,其中包含所有最新的更新,后端存储是dir,这是因为我相信

长话短说,容器文件夹被删除了。在使用extundelete和ext4magic之后,我成功地提取了一些数据库物理文件,似乎大部分文件都在那里。。。但不能百分之百确定是否遗漏了什么

我有两份数据库文件。一个来自9.5.3,看起来更完整,另一个来自9.6,最近我将容器升级到了9.6,但是它似乎缺少数据文件

我要做的就是尝试并提取与用户定义函数相关的SQL代码。有人知道我可以尝试的方法吗

注意:由于不良做法,最后一次备份有点过时,因此如果提取所需信息的任务合理且成功,这将是最后的手段

问候,, G

更新-20/4/2017 我希望通过从恢复的数据文件中提取函数体文本来快速修复。。。然而,今生没有什么是免费的:

从旧的ish备份和恢复的日志开始,我们设法覆盖了大量的空间,使数据库恢复了活力

经验教训: 1.执行良好的备份/恢复策略 2.不要将备份存储在同一台物理计算机上 3.硬件故障可能会造成中断。。。人为错误可能是灾难性的

注意:由于不良做法,最后一次备份有点过时,因此如果提取所需信息的任务合理且成功,这将是最后的手段

备份是您在这里的第一选择

如果9.5文件完整且未损坏,或者足以转储模式,则只需将其复制到位,检查权限并启动服务器即可。但是不要相信这些数据,你需要全部检查


尽管可以部分恢复给定的损坏文件,但这是一个漫长而复杂的过程,而且您询问堆栈溢出的事实可能意味着这不适合您。

如果您可以重建足够的数据目录,以单用户模式启动postgres,您可能可以转储pg_proc。但这似乎不太可能

否则,如果您真的很幸运,您将能够找到pg_proc的关系及其对应关系。后者通常包含压缩文本,因此搜索函数体中出现的部分变量可能对您没有帮助

在pg_proc中内联存储的任何函数都将是短函数,长度明显小于8k。其他一切都将在吐司关系中

要解码,你必须把这些页面解包,得到烤面包块,然后重新组装它们,如果压缩了就解压

如果必须这样做,我可能会在同一版本的新postgres实例中创建一个与pg_proc模式完全相同的表。然后,我将使用relfilenode映射文件找到pg_catalog.pg_proc的relfilenodes及其toast表(如果它幸存下来的话),或者通过模式匹配和猜测。我将用恢复的关系文件替换我创建的新表的空关系文件,重新启动postgres,如果我是对的,我将能够从表中进行选择

不容易

我建议你仔细阅读,因为你需要理解它


你可以考虑一下。免责声明,我为一家上市公司工作。

事后诸葛亮,他们说。。。我所追求的只是函数的代码,它的范围是几百KB。我希望这将是一个与旧代码库进行比较的问题。其余的数据可以用更少的成本重新创建,处理时间几乎是免费的。如果您有一个旧的函数副本,那么无论您最近做了什么更改,都很容易重新执行。顺便说一句,是时候对你的函数使用版本控制了。你忘记了最重要的建议:这些函数的源代码应该存储在源代码控制git、subversion。。。首先。那么,这根本就不是问题。吸取的教训缺少一个非常重要的部分:4。将源代码存储在版本控制系统中。Hi horse没有名字。。。我们把它放在另一个容器上。。。在同一台机器上。。。整个存储池已删除,因此。。。不幸的是,第三点占了上风……嗯。。。那不重要。。。如果你有适当的。。。将源代码存储在。。。版本控制系统。。。你的车坏了。钥匙似乎。。。影响我的。。。还有键盘。。。