PostgreSQL 全球開發團隊已發布我們資料庫系統所有支援版本的更新,包括 11.2、10.7、9.6.12、9.5.16 和 9.4.21。此版本變更了 PostgreSQL 與 fsync()
介面的行為,並包含分區的修復以及過去三個月報告的 70 多個其他錯誤。
使用者應計畫在下次排定的停機時間套用此更新。
當作業系統中可用並在組態檔中啟用時(預設啟用),PostgreSQL 會使用核心函數 fsync()
以協助確保資料寫入磁碟。在某些提供 fsync()
的作業系統中,當核心無法寫出資料時,它會傳回失敗並清除其資料緩衝區中應寫入的資料。
對於 PostgreSQL 而言,此清除操作有一個不幸的副作用:如果 PostgreSQL 再次嘗試透過再次呼叫 fsync()
將資料寫入磁碟,fsync()
將回報成功,但 PostgreSQL 認為已儲存到磁碟的資料實際上不會被寫入。這會產生可能的資料損毀情境。
此更新修改了 PostgreSQL 處理 fsync()
失敗的方式:PostgreSQL 將不再重試呼叫 fsync()
,而是會 panic。在這種情況下,PostgreSQL 可以從預寫日誌 (WAL) 重播資料,以協助確保資料已寫入。雖然這可能看起來不是最佳的解決方案,但目前幾乎沒有其他替代方案,並且根據報告,問題案例極為罕見。
新增了一個新的伺服器參數 data_sync_retry
來管理此行為。如果您確定您的核心在此類情境下不會丟棄髒資料緩衝區,您可以將 data_sync_retry
設為 on
以恢復舊的行為。
此更新引入了封裝版本說明的方式的變更。 從此更新開始,所有目前支援的 PostgreSQL 版本將僅包含其主要版本特定的版本說明。 例如,PostgreSQL 11 僅封裝版本 11.2、11.1 和 11.0 的版本說明。 不支援版本(PostgreSQL 9.3 及更早版本)的版本說明將在舊版本中提供,並可從 PostgreSQL 網站上即將發布的檔案中取得。
此更新也修復了過去幾個月報告的 70 多個錯誤。 其中一些問題僅影響版本 11,但許多問題影響所有支援的版本。
其中一些修復包括
INCLUDE
欄位的唯一索引的處理方式NOT NULL
限制在其分割區內得到遵守ON COMMIT DROP
和 ON COMMIT DELETE ROWS
應用於分割表和具有繼承子表的表的問題COPY FREEZE
ALTER TABLE .. ADD COLUMN
的多項修復,包括可能的索引損毀案例SELECT
的多個 SET
子句的 UPDATE
中可能發生的崩潰json[b]_populate_recordset()
或 json[b]_to_recordset()
時發生的崩潰CALL
語句的引數中解析排序規則敏感表達式TRUNCATE
的多項修復ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS
UNLISTEN
pg_hba.conf
中 LDAP 驗證項目的 ldapserver 參數中以空格分隔的主機名稱列表的解析\g target
與 COPY TO STDOUT
搭配使用--random-seed=N
時,pgbench
的隨機數生成現在是完全確定性的且與平台無關pg_basebackup
和 pg_verify_checksums
以適當地忽略暫存檔pg_dump
的多項修復,包括存在 ALTER INDEX SET STATISTICS
命令此更新還包含 tzdata 版本 2018i,用於哈薩克、梅特拉卡特拉和聖多美普林西比的 DST 法律變更。 哈薩克的克孜勒奧爾達區分為兩部分,建立一個新區 Asia/Qostanay,因為某些地區沒有變更 UTC 偏移量。 香港和無數太平洋島嶼的歷史修正。
所有 PostgreSQL 更新版本都是累積的。 與其他次要版本一樣,使用者不需要傾印和重新載入其資料庫,也不需要使用 pg_upgrade
即可套用此更新版本; 您可以簡單地關閉 PostgreSQL 並更新其二進位檔案。
跳過一個或多個更新版本的使用者可能需要執行其他更新後步驟; 請參閱先前版本的版本說明以取得詳細資訊。
PostgreSQL 9.4 將於 2020 年 2 月 13 日停止接收修復。 請參閱我們的版本控制政策以取得更多資訊。