【问题标题】:How to find the OID of the rows in a table in postgres?如何在 postgres 中查找表中行的 OID?
【发布时间】:2014-09-06 21:22:33
【问题描述】:

我最近在我们的 Postgres 数据库中遇到了一个问题,当我查询时:select * from myTable, 结果是“无法打开与 OID 892600370 的关系”。而且它的前端应用程序不能再正常运行了。根据我的研究,我确定了有错误的列,但我想准确定位该列的行 OID,以便我可以修改它。请帮忙。

提前谢谢你。

【问题讨论】:

  • 会不会是某个地方缺少某个文件,例如:/var/lib/pgsql/data
  • 考虑到文件丢失。你能帮我解决一些如何恢复它的方法吗?该目录也不存在。
  • 您需要备份或转储数据库。
  • 我无法转储它,因为发生了同样的错误,我无法转储该表,它正在中止。
  • 有谁能帮助我吗?

标签: postgresql oid


【解决方案1】:

您的数据库已损坏。可能是一个错误,但更可能是坏硬件。如果您有最近的备份,请使用它。不过我猜你不会。

  1. 确保找到数据库或其文件树的所有备份并确保它们安全。

  2. 停止 PostgreSQL 服务器并为整个数据库树(基础、全局、pg_xlog - 所有内容 在该级别)进行文件备份。现在可以安全地开始摆弄了...

  3. 现在,再次启动数据库服务器并一次转储一个表。如果表无法转储,请尝试删除任何索引和外键约束,然后再试一次。

  4. 对于不会转储的表,它可能只是某些行。使用COPY ... SELECT 删除所有索引并转储一系列行。这应该可以让您缩小任何损坏的行并获得其余的。

  5. 现在您有一个大部分已恢复的数据库,在另一台机器上恢复它并采取任何必要的步骤来确定损坏/丢失的内容以及需要做的事情。

  6. 在旧机器上运行全套测试,看看是否需要更换。考虑您的监控是否需要改进。

然后 - 确保下次保留正确的备份,这样您就不必执行所有这些操作,只需使用它们即可。

【讨论】:

    【解决方案2】:

    无法打开与 OID 892600370 的关系

    关系是一个表或索引。关系的 OID 是 pg_class 中定义此关系的行的 OID。

    试试select relname from pg_class where oid=892600370;

    通常从relname 可以立即看出这种关系是什么,否则您想查看 pg_class 中的其他字段:relnamespacerelkind、...

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2012-05-01
      • 2011-02-05
      • 2020-10-18
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多