0

所以,我(嗯......我是)在一个容器中运行 PostgreSQL(Ubuntu 14.04LTS 以及所有最近的更新,后端存储是“dir”,因为有说服力)。

长话短说,容器文件夹被删除了。在使用 extundelete 和 ext4magic 之后,我设法提取了一些数据库物理文件(看起来好像大多数文件都在那里......但不是 100% 确定是否以及丢失了什么)。

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

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

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

问候, G

更新 - 20/4/2017 我希望通过某种方式从恢复的数据文件中提取函数正文文本来“快速修复”......但是,这辈子没有什么是免费的 :)

从旧的备份和恢复的日志开始,我们设法覆盖了很多基础,使数据库恢复生机。

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

4

2 回答 2

1

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

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

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

要解码,您必须解压缩页面以获取 toast hunks,然后重新组装并解压缩它们(如果压缩)。

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

不容易。

我建议阅读postgres 的存储格式,因为您需要了解它。

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

于 2017-04-18T11:59:53.910 回答
0

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

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

如果 9.5 文件完整且未损坏(或足以转储模式),那么只需将它们复制到位,检查权限并启动服务器即可。但是不要相信数据,您需要全部检查。

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

于 2017-04-18T11:15:29.507 回答