2016-11-04 45 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的理由。 –