2011-03-07 43 views
16

無效頁頭,我在我的PostgreSQL數據庫得到一個錯誤PostgreSQL的:在塊

ERROR: invalid page header in block 411 of relation "t_value_time" 

。這在不同的機器上不斷髮生。有沒有辦法阻止它發生,或者至少告訴PSQL忽略無效塊上的數據並繼續前進?

我寧願從塊中丟失數據,讓他跳過它,讀取其餘數據。有沒有辦法告訴PSQL跳過這個塊?

回答

2

每次都一樣嗎?

從我讀到的,無效塊最常見的原因是硬件。 Red Hat有一個實用程序,pg_filedump,它將「PostgreSQL堆,索引和控制文件格式化爲人類可讀的格式」。我不認爲他們支持任何大於8.4.0的PostgreSQL版本,但我可能是錯的。

您希望通過使用嚴格,徹底的磁盤,RAM和NIC診斷來證明您的硬件良好。

1

沒有簡單的方法來完成它,但通過直接編輯數據文件(pg_class條目的relfilenode提供文件名)很容易。

只需將文件中其他地方的塊複製到壞塊上即可。理想情況下,合成一個空白塊或更新一個覆蓋的元素,使其中沒有有效的元組。

一旦你得到了一些不會產生錯誤的信息,請轉儲表並重新加載它以確保安全。

0

這些幾乎總是硬件問題順便說一句。驗證並測試RAM,磁盤,CPU。確保您的環境良好(功率輸入不良可能會導致過熱問題)。這是防止它的最好方法。解決這個問題的最佳方法是從基礎備份中進行時間點恢復。

23

警告:您將失去一些數據!通過pwkg.ork

database=# SET zero_damaged_pages = on; 
SET 
database=# VACUUM FULL damaged_table; 
WARNING: invalid page header in block xxx of relation base/yyy/zzz; zeroing out page 
[..] 
REINDEX TABLE damaged_table; 

修復:

我們設法克服它(DEV墜毀VM)發出。

+2

這是正確的解決方案。 「VACUUM FULL」和「REINDEX」並非嚴格需要清除警告。如果'zero_damaged_pa​​ges'開啓,任何從磁盤讀取頁面並觸發「無效頁面標題」錯誤的操作都將修復損壞的頁面(通過重新寫入所有零)來修復,因此您可以執行一個查詢,頁。 – simonp 2013-06-25 22:06:03