PostgreSQL 8.1 損壞問題
我有一個舊的 Postgres 伺服器,其中一個數據庫存在一些主要的損壞問題。當驅動器開始填滿應該有足夠空間的數據庫時,我們首先註意到了這個問題。該數據庫應該為報告目的提供 90 天的輪換數據供應,每月有數百萬個 DELETE 和 INSERT。經過進一步調查,執行 DELETE 並執行 VACUUM FULL 的作業失敗了。不僅如此,數據庫備份也失敗了。現在,由於驅動器已滿且歸檔速度快,我們處於困境中。
以下是詳細資訊:
- 我無法執行 VACUUM FULL 來釋放空間。
- 由於損壞錯誤,我無法備份數據庫。
- 所有最大的表/索引都已損壞。
- 由於損壞無法導出數據。
- 無法離線足夠長的時間以將 pg 目錄複製到新驅動器。
- 伺服器已經執行了約 2 年。重新啟動後可能會或可能不會恢復的舊物理盒。
以下是一些損壞錯誤…
錯誤:無法讀取關係 1663/24832/24875 的塊 7107494:成功
錯誤:無法讀取關係 1663/24832/24865 的塊 277779:輸入/輸出錯誤
我怎樣才能從中恢復過來?我正在考慮使用表觸發器將所有傳入數據插入到不同驅動器上的另一個數據庫中。這是一個選擇嗎?任何指導將不勝感激。
首先,停止數據庫並進行完整的物理備份。
備份後,
pg_dump
在您的數據庫上執行並確定表是如何發生此問題的。對於每個出現此錯誤的人,使用
LIMIT
並執行查詢OFFSET
以找到這些損壞的行。當你找到它時,用這個內容創建一個新表。看看這個例子(假設問題在第 101 行):
CREATE TABLE backup_of_table_with_problem AS SELECT * FROM table_with_problem LIMIT 100;
然後跳過有問題的元組
OFFSET
:INSERT INTO backup_of_table_with_problem SELECT * FROM table_with_problem OFFSET 101;
當您能夠轉儲數據庫時(不包括出現此錯誤的表),我建議您刪除整個集群並創建一個新集群來恢復此轉儲文件。
希望能幫助到你。
參考:
由於損壞錯誤,我無法備份數據庫。
所有最大的表/索引都已損壞。
由於損壞無法導出數據。
恕我直言,您不再擁有“數據庫”。
你有一堆損壞的“東西”,Postgres 正在盡最大努力去理解,但它正在打一場失敗的戰鬥。
無法離線足夠長的時間以將 pg 目錄複製到新驅動器。
你別無選擇。
如果您的磁碟出現故障,那麼這些小磁坑中的一個在關鍵問題下發生故障並佔用整個數據庫以及您的應用程序堆棧只是時間問題。
關閉數據庫,保護您自己調查的所有副本,然後開始恢復您的最後一個
$$ good $$備份以使系統再次執行。 這些副本讓您有機會嘗試恢復恢復過程中將失去的一些內容。您不應該期望在複製的數據文件之上執行系統;他們是吐司。
是的,恢復數據庫會失去數據,但是作為恢復策略的一部分,會失去多少以及恢復數據庫並執行多**長時間,不是嗎?