2016-11-04 43 views
0

再次,请亲切。我不是dba,我继承了一些旧的postgress数据库。postgres createdb无法打开关系

我的一个运行的Postgres 7.4.7非常古老的Debian服务器的填充数据的文件系统。我的一个队列决定尝试一个reindex,然后是“真空全部”。所有这些都失败了,给我留下了更少的空间。现在当我运行'psql -h'作为postgres时,我得到

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

我可以使用PSQL来访问数据库中的问题。如果我'psql数据库'我可以运行'CREATE DATABASE temp;'但'psql临时失败,出现上述错误。我确实有看起来有效的pg_dumps。哦,没有像我在其他服务器上看到的那样的postgres数据库。我的问题是:有没有办法解决上述错误或失败,有没有办法完全重置数据库?

请记住,(因为我想尽可能多),我不能升级Postgres的。 有些东西,我希望可以帮助:

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

还有一件事。我从星期天起以六种方式完成Google。我发现最好的方法是调用remove文件并运行initdb。但我有一种感觉可能不是最好的选择。但是我知道什么?我只是Linux管理员。 –

+0

也许企业家们有一些工具可以帮助你恢复数据库。 – McNets

+0

之前有免费订阅时间。 – McNets

回答

0

哦,有没有Postgres数据库就像我在其他服务器上

这是不好的看到。

这听起来就像有人(不是你的,大概)试图DROP TABLE pg_somethingorother;。由于pg_表(也称为目录)是表名,触发器代码等等的东西,所以这种类型的表删除会导致很多问题。

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

你刚才说,你有一些有效的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. 创建一个定期的备份过程,所以如果您将来确实有这个问题(或其他问题),那么您就有了更自信的方式。

如果你不能得到一台具有足够老的postgres来测试转储文件的机器,那么你可以尝试加载转储文件到一个更新的postgres。这个应该在大多数情况下工作。但它可能会遇到一些问题。如果有效,请继续执行步骤2和之后的操作。如果它适用,但有一些错误,并且您不确定发生了什么,则可能仍值得继续执行步骤2。

如果转储文件没有的工作,你可能会被淘汰。但我会假设他们这样做,因为替代方案是令人伤心的。

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

+0

*“由于postgres数据库是存放表名,触发代码等的地方,所以很少有工作要做。”*不,这不是PostgreSQL的工作原理。搜索此文本的[initdb](https://www.postgresql.org/docs/current/static/app-initdb.html):“postgres数据库是供用户,实用程序和第三方应用程序使用的默认数据库“。另请参见http://stackoverflow.com/a/28261773/562459 –

+0

你是绝对正确的 - 我正在混淆'postgres'数据库和目录。我已经更新了我的答案以反映这一点 - 我答案的其余部分。 – jmelesky

+0

没有数据库'postgres'是完全正常的。这是在PostgreSQL 8.1中引入的。此外,至少将数据库升级到7.4.30势在必行。事实上,除非你不介意丢失你的数据,否则不能有7.4的理由。 –