一、修復策略
1、有備份使用備份恢復
備份包括:備份+歸檔
2、跳過壞快參數
ignore_checksum_failure、zero_damaged_pages,恢復後會丟失部分數據
ignore_checksum_failure (boolean)
只有當data checksums被啓用時纔有效。在讀取過程中檢測到一次校驗碼失敗通常會導致PostgreSQL報告一個錯誤。設置ignore_checksum_failure爲打開會導致系統忽略失敗(但是仍然報告一個警告),並
且繼續執行。這種行爲可能導致崩潰、傳播或隱藏損壞或者其他嚴重的問題。但是,它允許你繞過錯誤並且在塊頭部仍然健全的情況下從表中檢索未損壞的元組。如果頭部被損壞,即便這個選項被啓用系統也將報告一個錯誤。默認設置是off,並且只能被超級用戶改變。
zero_damaged_pages (boolean)
檢測到一個損壞的頁面頭部通常會導致PostgreSQL報告一個錯誤,並且中止當前事務。把zero_damaged_pages設置爲打開會讓系統報告一個警告、把損壞的頁面填充零,然後繼續處理。這種行爲會毀掉數據,即被損壞頁面上的所有行。但是它允許你繞開錯誤並且從可能存在表中的任何未損壞頁面中檢索行。如果由於一次硬件或軟件錯誤而發生毀壞,這種方法可用於恢復數據。通常你不應該把它設置爲打開,除非你已經徹底放棄從表的損壞頁面中恢復數據。被填充零的頁面不會被強制到磁盤上,因此我們推薦在再次關閉這個參數之前先重建表或索引。默認的設置是off,並且只有超級用戶可以改變它。
磁盤出問題,導致日誌壞快,配置此參數,未成功
3、修復壞快
使用dd 重寫,恢復後,會丟失部分數據
二、壞快分類
1、索引壞快
修復方法:
可以直接重建索引
2、數據文件壞快
常見數據也損壞:
could not read block N of relation X/Y/Z: read only 0 of 8192 bytes catalog is missing N attribute(s) for relid M WARNING: page verification failed, calculated checksum %u but expected %u ERROR: invalid page in block %u of relation %s
修復方法:
1)ignore_checksum_failure加zero_damaged_pages
此方法如果在數據庫無法開啓的情況下,可能無法使用,待確認。。。
2)dd重寫數據文件
根據報錯,找到對應的文件
使用dd方法新建損壞的文件(空文件)
3、日誌文件壞快
暫時未遇到這種情況
注意:日誌文件損壞,可能導致數據庫無法啓動,如果沒有備份,可用dd重寫(清空)損壞的日誌文件
參考文檔:
postgreSQL 常見數據頁損壞壞塊問題
http://www.askmac.cn/archives/postgresql-corruption.html
PostgreSQL checksum
https://blog.csdn.net/weixin_34122548/article/details/89595195