Postgres 數據損壞工具?
是否有任何技術/工具/方法來調查 postgres 表中的行級損壞?
這個論壇上提出的大多數解決方案都歸結為“嘗試執行 VACUUM FULL 來重建表,如果這不起作用,請刪除表並從備份中恢復”
反正有沒有真正修復數據?是否有讀取和手動編輯原始 postgres 數據文件並僅刪除/修復損壞的行的方法?
我正在使用的系統直接從外部提要讀取數據到 postgres 表中,然後在夜間備份過程有機會保存它之前顯示損壞的證據。重新執行外部提要不是一種選擇,因此在實踐中,如果我有任何損壞,一整天的數據都會失去。
PostgreSQL 可以包含兩個(嗯,一個和一個包裝器)工具,它們可能會在這里為您提供幫助—— amcheck和pg_amcheck。
檢查:
amcheck
是一個contrib 模組(以下簡稱 cm) - 這些是作為源分發的一部分提供的附加功能,但預設情況下未啟用。請注意,許多這些 cm 被廣泛使用,並且許多人建議它們應該預設出現 - 然而,PostgreSQL 的“精益和平均”理念意味著它們不是,新使用者可能需要時間來弄清楚如何準確地充分利用它們。例如,該
pg_stat_statements
擴展被 PostgreSQL 社區中的所有重量級人物廣泛使用和推薦。順便說一句,“貢獻模組”和“擴展”基本上是同義詞。但是請注意,雖然所有 cm 都是擴展,但並非所有擴展都是 cm - 遠非如此。例如,雖然TimescaleDB和CitusData 都不是 cm(即它們沒有與原始碼捆綁在一起),但它們是擴展!如果您有興趣,這裡有一個完整的PostgreSQL 擴展生態系統。恕我直言,回到正題!
amcheck 模組提供了允許您驗證關係結構的邏輯一致性的功能。
在 PostgreSQL 中,關係是表或索引。
amcheck 可以有效地檢測數據校驗和無法擷取的各種類型的故障模式。
您可以訪問 amcheck 頁面以獲取有關其功能的更多詳細資訊。
pg_amcheck:
pg_amcheck 實用程序可以在
$PGHOME/bin
目錄中找到。只有在使用make world
或等效編譯數據庫時才能在此處找到它。它可能會或可能不會安裝在您自己的發行版上,具體取決於 - 我可以確認它包含在 EnterpriseDB 的 Windows (14) 發行版中 - 我目前無法與其他發行版交談。如上所述,它是
amcheck
擴展的包裝器:pg_amcheck 支持對一個或多個數據庫執行 amcheck 的損壞檢查功能,可以選擇檢查哪些模式、表和索引,執行哪種檢查,以及是否並行執行檢查,如果是,並行數連接建立和使用。
必須安裝amcheck 擴展才能使用包裝器(有意義!)。
請注意(來自頁面):
- 一般來說,amcheck 只能證明腐敗的存在;它不能證明它的缺席。
- (釋義)- amcheck 僅適用於 B-tree 索引。
後者是,(恕我直言),一個嚴重的漏洞。
案例:
因此,讓我們看一下這些工具的實際案例。
- 2022 年 5 月 24 日,Michael Paquier 在推特上發布了關於使用 PostgreSQL 14 的潛在腐敗問題
- 2022-06-02 pganalyze.com上的一篇文章展示瞭如何使用 amcheck 來確認 bug 並查看它是否影響了您的系統
概括:
這裡的重點是——我認為——沒有系統
$$ is | can be | ever will be $$完美的工具,比如這些$$ are | can be | may be $$在可能存在潛在問題的情況下不時需要 - 這有點像自衛權 - 你永遠不想使用它,但你知道它就在那裡,以防萬一! NB PostgreSQL 已經在 2022 年 6 月 9 日發布了一個非週期版本——所有這一切的偉大之處在於它都是在公開的郵件列表中完成的,供大家查看!