Postgresql

如何驗證 postgres 9.3 db 沒有損壞?

  • June 9, 2020

我有一個在 ubuntu 伺服器上執行的 postgres 9.3 db。

大約一個月前,我們的 VPS 託管公司解決了伺服器上的硬體問題。

問題很快得到解決,一切似乎都執行良好。

我們使用不同伺服器上的酒保執行備份 - 並且備份和恢復工作正常(我檢查過)。

數據損壞的第一個跡像是幾天前:我決定像我每隔一段時間那樣在我們的數據庫上做一個完整的 pg_dump,但它失敗了(塊中的頁頭無效……) - 數據似乎已經很久以前損壞 - 大約在硬體問題發生時(即損壞記錄上的日期)。我求助於找到損壞的記錄,然後將其刪除並手動恢復。

在那之後,我能夠做一個完整的 pg_dump。

為了檢查其他損壞 - 我從備份中設置了不同的數據庫伺服器並在所有表上執行 pg_repack 以驗證我能夠重建所有索引和表。

**我的問題是:

  1. 我如何確定我的數據庫中沒有任何額外的損壞?**

2. 我可以做些什麼來定期檢查我的數據完整性?

3. 除了轉儲整個數據庫並重新索引它(我已經做過)之外,我還能做些什麼來驗證我們的數據庫的完整性?

PS - 我沒有啟用塊校驗和。

如果您已使用校驗和初始化集群,則可以在備份時使用pg_backrest.

PostgreSQL 從 9.3 開始支持頁面級校驗和。如果啟用頁面校驗和,pgBackRest 將驗證備份期間複製的每個文件的校驗和。

您將在此處找到有關校驗和的更多資訊:https ://www.postgresql.org/docs/current/static/app-initdb.html#APP-INITDB-DATA-CHECKSUMS

你也可以做一個pg_dumpto /dev/null(如果你沒有足夠的空間來保存一個邏輯轉儲)。這應該確保您可以讀取每個數據塊。

PGD​​G 今年進行了討論,因為有些人希望預設啟動校驗和。你可以在那裡找到它:http ://www.postgresql-archive.org/Checksums-by-default-td5940158.html

如果可以的話,現在有新的工具可以做到這一點:

兩者都可以啟動或停用集群上的校驗和,以及在離線集群上執行檢查。如果您擔心損壞,您可以在整個集群上執行其中的一部分。請注意,根據個人經驗, pg_verify_checksum 在舊版本上執行良好,並且 pg_checksum 預計具有相同的行為。

即使它現在已經很老了,我建議閱讀這篇文章:http ://blog.ringerc.id.au/2012/10/avoiding-postgresql-database-corruption.html

引用自:https://dba.stackexchange.com/questions/173510