博客 / 詳情

返回

Postgres 18 默認開啓數據校驗及升級應對方案

在 Greg Sabino Mullane 編寫的最新 Postgres 補丁中,Postgres 對數據完整性機制進行了調整:從 Postgres 18 開始,數據校驗(data checksum)功能默認啓用

這一變更在發佈説明中看起來只是一個相對較小的調整,但針對的是數據庫運行過程中較難察覺的風險之一—靜默數據損壞(silent data corruption),對系統可靠性具有實際意義。

本文對數據校驗的工作機制、默認行為的變化,以及升級過程中需要關注的問題進行簡要説明。

什麼是 data checksum

數據校驗(data checksum)是一種簡單但非常有效的技術,用於驗證存儲在磁盤上的數據頁完整性。該功能相當於為數據庫內每個 8KB 數據塊(即 “數據頁”)生成專屬的數字指紋。

其工作機制如下:

  • 生成機制:當 Postgres 將數據頁(包含表與索引數據)寫入磁盤時,系統會對數據頁內容執行特定算法計算,生成一個簡短的衍生數值,即校驗值
  • 存儲方式:生成的校驗和會與數據一同存儲在數據頁頭部。
  • 校驗流程:當 Postgres 從磁盤讀取該數據頁時,會立即基於讀取的內容重新計算校驗值,並與存儲的數值進行比對。

若兩次計算的數值不一致,則表明該數據頁自上次寫入後已發生篡改或損壞。這一校驗機制至關重要,原因在於數據損壞可能以靜默形式發生。一旦檢測到數值不匹配,PostgreSQL 會立即拋出錯誤,以此警示潛在的數據問題。此外,校驗和還是 pgBackRest 工具的核心組成部分,該工具藉助校驗和完成備份文件的完整性驗證。

什麼是 initdb,它為什麼重要

initdb 是 Postgres 中用於創建新的數據庫集羣的工具,用於初始化 Postgres 存放所有永久數據的數據目錄。執行 initdb 命令時,系統將完成以下操作:

  1. 創建數據目錄結構;
  2. 創建 template1postgres 等模板數據庫;
  3. 填充初始系統目錄表;
  4. 創建服務器配置文件的初始版本;
  5. 啓用並開始記錄數據校驗值。

其調用形式通常如下:

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

對於使用雲託管 Postgres 服務或使用 Postgres.app 等本地工具的用户而言,通常無需直接執行 initdb 命令,因其屬於一次性的管理員配置操作。

initdb 命令的新默認參數:–data-checksums

在以往的版本中,數據庫管理員需在執行 initdb 命令時手動添加 --data-checksums 參數,才能啓用數據校驗。如果忘記添加該參數,或並不瞭解這一特性,新建集羣將不會啓用內建的數據完整性校驗機制。

如今,initdb 命令的默認行為已變更為在每次初始化 PostgreSQL 時自動啓用數據校驗功能。

  • 舊版命令(默認關閉數據校驗):
    initdb -D /data/pg14
  • 新版默認命令(默認開啓數據校驗):
    initdb -D /data/pg18

此項變更符合 PostgreSQL 最佳實踐規範。所有新建數據庫集羣將自動具備數據損壞防禦能力,無需管理員執行額外操作。

–no-data-checksums 參數

在某些特定場景下,可能需要顯式關閉數據校驗值機制,此時可以使用新增的參數:

initdb --no-data-checksums -D /data/pg18

數據校驗與 pg_upgrade

儘管新默認值的設定具備顯著優勢,但對於使用 pg_upgrade 工具執行大版本升級的場景,可能引發兼容性問題。

pg_upgrade 工具的工作原理是將舊版本數據目錄與新版本數據目錄建立關聯,其核心要求為新舊兩個數據庫集羣的校驗和配置必須保持一致,即同時開啓或同時關閉。

若待升級的舊版 PostgreSQL 集羣創建於該功能變更之前,其校驗功能大概率處於關閉狀態,此時執行 pg_upgrade 升級操作會因配置不匹配而失敗。

在緊急升級場景下,若需對未啓用校驗和的舊集羣執行升級,管理員可在初始化新集羣時添加 --no-data-checksums 參數,使新舊集羣的配置保持一致。

為現有 Postgres 數據庫啓用數據校驗

相比長期運行在未啓用數據校驗的狀態下,更合理的做法是在下一次升級前為數據庫補充這一機制。然而,目前並不存在無需停機即可完成該操作的方式。為已有數據庫啓用數據校驗需要停機並重啓實例,在數據庫規模較大的情況下,該過程可能較為緩慢。

Postgres 提供了 pg_checksums 工具用於完成這一操作,並且相關文檔已有較為完整的説明。

在對可用性要求較高的環境中,可以先在副本節點上啓用數據校驗值,再通過故障切換的方式完成遷移。

結語

數據校驗是 Postgres 中一項非常有價值的特性,並已成為新的默認配置。對於此前尚未啓用該機制的數據庫,應儘早規劃啓用方案,尤其是在自管理環境進行主版本升級時,需要提前考慮由此帶來的升級與兼容性影響。

原文鏈接:

https://www.crunchydata.com/blog/postgres-18-new-default-for-...

作者:Greg Sabino Mullane

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.