PostgreSQL - 恢复功能'意外删除数据文件后的代码

时间:2017-04-18 10:56:29

标签: postgresql function recover data-files

所以,我(好吧......我)在一个容器内运行PostgreSQL(Ubuntu 14.04LTS包含所有最近的更新,后端存储是" dir"因为说服了)。

简而言之,容器文件夹已被删除。在使用了extundelete和ext4magic之后,我设法提取了一些数据库物理文件(好像大多数文件都在那里......但不是100%确定是否以及缺少什么)。

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

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

P.S。:上次备份有点过时(实际上是由于不良做法)所以如果提取所需信息的任务是“合理的”,那将是最后的选择。并且"成功"。

此致 ģ

更新 - 2017年2月2日 我希望快速修复"通过某种方式从恢复的数据文件中提取功能正文...但是,这一生中没有任何东西是免费的:)

从旧版备份和恢复的日志开始,我们成功地将数据库重新用于生活。

经验教训
1. 执行实施良好的备份/恢复策略
2. 不要在同一台物理机上存储备份
3.硬件故障可能破坏性 ...人为错误可能灾难性的!

2 个答案:

答案 0 :(得分:1)

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

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

pg_proc中内联存储的任何内容都是短函数,长度远小于8k。其他一切都将处于敬酒关系中。

要解码您必须解压缩页面以获得祝酒词,然后重新组合它们并解压缩它们(如果压缩)。

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

不容易。

我建议您阅读postgres's storage format,因为您需要了解它。

您可以考虑https://www.postgresql.org/support/professional_support/。 (免责声明,我为其中一家上市公司工作)。

答案 1 :(得分:0)

  

P.S。:上次备份有点过时(实际上是由于不良做法)所以如果提取所需信息的任务“合理”和“成功”,这将是最后的手段。

备份是您的第一手段。

如果9.5文件完整且没有损坏(或者足以转储架构),那么只需将它们复制到位,检查权限并启动服务器就可以了。不要相信数据,你需要检查所有数据。

虽然 可以部分恢复给定的损坏文件,但这是一个漫长而复杂的过程,而且您在Stack Overflow上询问的事实可能意味着它不适合您。