2014-09-06 137 views
0

我最近在我們的Postgres數據庫中遇到了一個問題,當我查詢:select * from myTable, 它導致'無法打開與OID 892600370的關係'。而且它的前端應用程序無法正常運行。根據我的研究,我確定了有錯誤的列,但我想要準確找到列的行OID,以便我可以對其進行修改。請幫忙。如何在postgres中的表中找到行的OID?

預先感謝您。

+0

難道說一個文件是從某處丟失:'/ var/lib/pgsql/data'? – 2014-09-06 02:53:42

+0

考慮到文件丟失。你能幫我解決一些問題嗎?該目錄也不存在。 – jorge 2014-09-06 03:03:54

+0

您需要備份或轉儲數據庫。 – 2014-09-06 04:59:06

回答

1

你有一個損壞的數據庫。可能是一個錯誤,但更可能是壞的硬件。如果您有最近的備份,只需使用它即可。我猜你不會。

  1. 請確保您找到數據庫或其文件樹的任何備份並保持它們的安全。

  2. 停止PostgreSQL服務器並對整個數據庫樹(基礎,全局,pg_xlog - 在該級別的所有)進行文件備份。現在開始擺弄...

  3. 現在,再次啓動數據庫服務器並逐個轉儲表。如果表不會轉儲,請嘗試刪除任何索引和外鍵約束,然後再轉一次。

  4. 對於不會轉儲的表,它可能只是某些行。刪除任何索引並使用COPY ... SELECT轉儲一系列行。這應該讓你縮小任何損壞的行並得到其餘的。

  5. 現在,您已經擁有了一個大部分恢復的數據庫,可以在另一臺機器上恢復它,並採取所需的任何步驟來確定損壞/丟失以及需要執行的操作。

  6. 在舊機器上運行一套完整的測試,看看是否有什麼需要更換。考慮你的監測是否需要改進。

然後 - 確保您下次保持正確的備份,這樣您就不必這樣做,您只需使用它們。

0

可以用OID 892600370

一個關係不開關係是一個表或索引。關係的OID是定義該關係的pg_class中行的OID。

嘗試select relname from pg_class where oid=892600370;

通常是從relname馬上明白這關係是什麼,否則你想看看在pg_class裏的其他領域:relnamespacerelkind ...