無效頁頭,我在我的PostgreSQL數據庫得到一個錯誤PostgreSQL的:在塊
ERROR: invalid page header in block 411 of relation "t_value_time"
。這在不同的機器上不斷髮生。有沒有辦法阻止它發生,或者至少告訴PSQL忽略無效塊上的數據並繼續前進?
我寧願從塊中丟失數據,讓他跳過它,讀取其餘數據。有沒有辦法告訴PSQL跳過這個塊?
無效頁頭,我在我的PostgreSQL數據庫得到一個錯誤PostgreSQL的:在塊
ERROR: invalid page header in block 411 of relation "t_value_time"
。這在不同的機器上不斷髮生。有沒有辦法阻止它發生,或者至少告訴PSQL忽略無效塊上的數據並繼續前進?
我寧願從塊中丟失數據,讓他跳過它,讀取其餘數據。有沒有辦法告訴PSQL跳過這個塊?
每次都一樣嗎?
從我讀到的,無效塊最常見的原因是硬件。 Red Hat有一個實用程序,pg_filedump,它將「PostgreSQL堆,索引和控制文件格式化爲人類可讀的格式」。我不認爲他們支持任何大於8.4.0的PostgreSQL版本,但我可能是錯的。
您希望通過使用嚴格,徹底的磁盤,RAM和NIC診斷來證明您的硬件良好。
沒有簡單的方法來完成它,但通過直接編輯數據文件(pg_class條目的relfilenode提供文件名)很容易。
只需將文件中其他地方的塊複製到壞塊上即可。理想情況下,合成一個空白塊或更新一個覆蓋的元素,使其中沒有有效的元組。
一旦你得到了一些不會產生錯誤的信息,請轉儲表並重新加載它以確保安全。
這些幾乎總是硬件問題順便說一句。驗證並測試RAM,磁盤,CPU。確保您的環境良好(功率輸入不良可能會導致過熱問題)。這是防止它的最好方法。解決這個問題的最佳方法是從基礎備份中進行時間點恢復。
警告:您將失去一些數據!通過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)發出。
這是正確的解決方案。 「VACUUM FULL」和「REINDEX」並非嚴格需要清除警告。如果'zero_damaged_pages'開啓,任何從磁盤讀取頁面並觸發「無效頁面標題」錯誤的操作都將修復損壞的頁面(通過重新寫入所有零)來修復,因此您可以執行一個查詢,頁。 – simonp 2013-06-25 22:06:03