我最近在我們的Postgres數據庫中遇到了一個問題,當我查詢:select * from myTable, 它導致'無法打開與OID 892600370的關係'。而且它的前端應用程序無法正常運行。根據我的研究,我確定了有錯誤的列,但我想要準確找到列的行OID,以便我可以對其進行修改。請幫忙。如何在postgres中的表中找到行的OID?
預先感謝您。
我最近在我們的Postgres數據庫中遇到了一個問題,當我查詢:select * from myTable, 它導致'無法打開與OID 892600370的關係'。而且它的前端應用程序無法正常運行。根據我的研究,我確定了有錯誤的列,但我想要準確找到列的行OID,以便我可以對其進行修改。請幫忙。如何在postgres中的表中找到行的OID?
預先感謝您。
你有一個損壞的數據庫。可能是一個錯誤,但更可能是壞的硬件。如果您有最近的備份,只需使用它即可。我猜你不會。
請確保您找到數據庫或其文件樹的任何備份並保持它們的安全。
停止PostgreSQL服務器並對整個數據庫樹(基礎,全局,pg_xlog - 在該級別的所有)進行文件備份。現在開始擺弄...
現在,再次啓動數據庫服務器並逐個轉儲表。如果表不會轉儲,請嘗試刪除任何索引和外鍵約束,然後再轉一次。
對於不會轉儲的表,它可能只是某些行。刪除任何索引並使用COPY ... SELECT
轉儲一系列行。這應該讓你縮小任何損壞的行並得到其餘的。
現在,您已經擁有了一個大部分恢復的數據庫,可以在另一臺機器上恢復它,並採取所需的任何步驟來確定損壞/丟失以及需要執行的操作。
在舊機器上運行一套完整的測試,看看是否有什麼需要更換。考慮你的監測是否需要改進。
然後 - 確保您下次保持正確的備份,這樣您就不必這樣做,您只需使用它們。
可以用OID 892600370
一個關係不開關係是一個表或索引。關係的OID是定義該關係的pg_class
中行的OID。
嘗試select relname from pg_class where oid=892600370;
通常是從relname
馬上明白這關係是什麼,否則你想看看在pg_class裏的其他領域:relnamespace
,relkind
...
難道說一個文件是從某處丟失:'/ var/lib/pgsql/data'? – 2014-09-06 02:53:42
考慮到文件丟失。你能幫我解決一些問題嗎?該目錄也不存在。 – jorge 2014-09-06 03:03:54
您需要備份或轉儲數據庫。 – 2014-09-06 04:59:06