postgres createdb无法打开关系

时间:2016-11-04 19:07:44

标签: postgresql

再次,请善待。我不是dba而且我继承了一些旧的postgress数据库。

运行postgres 7.4.7的一个非常古老的debian服务器填充了数据文件系统。我的一个同伙决定尝试重新索引,接着是真空吸尘器。所有这一切都惨遭失败,让我的空间更小。现在,当我运行' psql -h'作为postgres我得到了

  

' psql:致命:无法打开关系" pg_trigger":没有这样的文件或目录'。

我可以使用psql访问有问题的数据库。如果我是psql数据库'我可以运行select: function(start, end) { .... $("#btnSave").one("click", function() { .... } } 但是' psql temp失败并出现上述错误。我确实有看似有效的'CREATE DATABASE temp;'。哦,我在其他服务器上看到的没有postgres数据库。我的问题是:有没有办法解决上述错误或失败,有没有办法完全重置数据库?

请记住,我无法升级postgres(尽我所能)。 我希望有些事可能会有所帮助:

  • 数据位于/ var / lib / postgres / data / base。
  • 当我运行createdb或dropdb时,我收到致命错误。
  • 这不是我的错,但它现在是我的烂摊子。

1 个答案:

答案 0 :(得分:0)

  

哦,我在其他服务器上看到的没有postgres数据库

那很糟糕。

听起来有人(不是你,大概)试图DROP TABLE pg_somethingorother;。由于pg_表(也称为目录)是保存表名,触发器代码等的地方,因此这种表丢弃会导致许多问题。

  

有没有办法解决上述错误或失败,是否有办法完全重置数据库?

您之前说过,您有一些有效的pg_dump文件。我建议采取以下行动:

  1. 测试这些转储文件。理想情况下,这意味着获得具有磁盘空间的机器,以及相应的postgres版本(7.4.7是古老的,因为您注意,所以这可能很难),发出initdb,然后加载转储文件(如果文件中有明文sql,类似于psql < dumpfile;如果它不是文本,你将使用pg_load)。
  2. 如果转储文件有效,请返回原始计算机,删除损坏的数据库目录(/var/lib/postgres/data - 包含base的目录及其中的conf文件。
  3. 使用initdb从头开始,然后加载,就像在步骤1中一样。
  4. 创建一个cron,向您的数据库发出相应的vacuum语句,以便您将来不太可能遇到此问题。
  5. 创建一个定期备份过程,因此如果您将来遇到此问题(或其他问题),您可以更加自信地前进。
  6. 如果你不能使用足够旧的postgres来测试转储文件,那么你可以尝试将转储文件加载到更新的postgres中。在大多数情况下, 应该。但是,它可能会遇到一些问题。如果可行,请继续执行步骤2。如果它有点工作,但有一些错误,并且你不确定是什么,它仍然值得继续进行第2步和第2步。

    如果转储文件工作,您可能会受到冲击。但我会假设他们这样做,因为替代方案很难过。

    对不起你,在这种情况下,祝你好运。