PostgreSQL 9.6.2、9.5.6、9.4.11、9.3.16 和 9.2.20 已發布!

發布於 2017-02-09,由 PostgreSQL 全球開發團隊

PostgreSQL 全球開發團隊發布了對我們資料庫系統所有支援版本的更新,包括 9.6.2、9.5.6、9.4.11、9.3.16 和 9.2.20。此版本包含修復,可防止索引建立以及某些預寫式日誌重播情況下的資料損毀問題,詳情如下。它還修補了過去三個月中報告的 75 多個其他錯誤。

使用者應計畫在下一次排定的停機時間套用此更新。

使用 CREATE INDEX CONCURRENTLY 建立時發生損毀

如果對先前未建立索引的欄位呼叫 CREATE INDEX CONCURRENTLY,則存在競爭條件,然後由與 CREATE INDEX CONCURRENTLY 命令同時執行的交易更新的列可能會被錯誤地建立索引。

如果您懷疑可能發生這種情況,最可靠的解決方案是在安裝此更新後重建受影響的索引。

此問題存在於 PostgreSQL 的 9.2、9.3、9.4、9.5 和 9.6 系列中。

可見性和預寫式日誌穩定性的修復

此版本包含多項修復,可提高可見資料和 WAL 日誌的穩定性,我們希望在此強調。

在此版本之前,當用於目錄掃描的特殊快照目前可用時,資料可能會被 vacuum 操作過早刪除。具體來說,vacuum 操作不會知道此特殊快照的最舊 xmin。錯誤會顯示類似以下的訊息

"cache lookup failed for relation 1255"

此版本可確保 vacuum 操作會將目錄掃描快照納入考量。

此外,還有多項修復可提高預寫式日誌記錄的穩定性,包括

  • BRIN 索引 WAL 日誌記錄的修復,其中重播可能會使 BRIN 索引的一部分無用,需要重新計算
  • 未記錄表格的修復,其中將在 "wal_level = minimal" 設定下建立 WAL 日誌,並且在崩潰後重播時,表格似乎未正確重置
  • WAL 頁面標頭驗證中的修復,當重新讀取區段時,修復了在復原期間可能報告的 "out-of-sequence TLI" 錯誤

這些問題存在於 PostgreSQL 9.6 系列版本中,也可能存在於 9.2、9.3、9.4 和 9.5 系列中。

錯誤修復和改進

此更新還修復了過去幾個月報告的許多錯誤。其中一些問題僅影響 9.6 系列,但許多問題影響所有支援的版本。此版本提供了 75 多個修復,包括

  • 在熱備援模式下運作的幾項修復
  • 不允許在 synchronous_standby_names 中將 num_sync 欄位設定為零
  • 不要將背景工作程序計入使用者的連線限制
  • 修復檢查擴充功能成員物件何時可以刪除
  • 修復擴充功能成員物件的初始權限追蹤,使其能正確與 ALTER EXTENSION ... ADD/DROP 搭配運作
  • 幾項 vacuum 和 autovacuum 修復
  • 修復 CREATE OR REPLACE VIEW,以便在嘗試套用新的檢視選項之前更新檢視查詢
  • 確保 ALTER TABLE 在重建索引時保留索引資料表空間指派
  • 查詢計畫器的一些修復,包括外部資料表和 CTE 的修復
  • 全文檢索功能的一些修復,以提高搜尋的準確性和效能
  • 幾個陣列函數的一些修復和效能改進
  • 外鍵約束與特定 ALTER TABLE 操作相關的觸發函數之間互動的一些修復
  • 刪除傳回不正確資料的日期/時間資料類型的最佳化
  • 修復檢視 reloption 作為常規資料表 reloption 的不正確使用
  • 修復在使用 ON CONFLICT 與寬資料表時出現的不正確 "target lists can have at most N entries" 抱怨
  • 修復在具有已刪除欄位的資料表上進行 INSERT 或 UPDATE 期間出現的虛假 "query provides a value for a dropped column" 錯誤
  • 防止 foo.* 在 UPDATE 來源表達式中進行多欄展開
  • 確保針對多列 VALUES 建構子準確判斷欄位類型修飾符
  • psql 命令列工具的一些修復
  • 防止 pg_start_backup() 和 pg_stop_backup() 的多次呼叫同時執行
  • pg_dump、pg_restore 和 pg_basebackup 的一些修復,包括在包含 WAL 檔案時,備用伺服器上可能發生的 pg_basebackup 失敗
  • 平行工作程序和平行查詢計畫的一些修復,包括修復平行查詢可用的工作程序數量在重新掃描期間減少時發生的崩潰
  • PL/pgSQL、PL/Python 和 PL/Tcl 的一些修復
  • contrib 模組的一些修復
  • 允許在 ~/.pgpass 檔案中使用 DOS 樣式的行尾符號,即使在 Unix 上也是如此

將時區資料檔案更新到 tzdata 版本 2016j,以處理北賽普勒斯(新增 Asia/Famagusta 新時區)、俄羅斯(新增 Europe/Saratov 新時區)、東加和南極洲/凱西的 DST 法律變更。義大利、哈薩克、馬爾他和巴勒斯坦的歷史修正。切換為優先使用東加的數字時區縮寫。

更新

所有 PostgreSQL 更新版本都是累加的。與其他次要版本一樣,使用者不需要轉儲和重新載入其資料庫或使用 pg_upgrade 即可套用此更新版本;您可以簡單地關閉 PostgreSQL 並更新其二進位檔案。

如果您認為您受到了上述 CREATE INDEX CONCURRENTLY 錯誤的影響,則必須重建索引。以下是如何在生產系統中重建索引而不失去使用索引能力的範例

CREATE INDEX CONCURRENTLY new_index_name ON table_name (column_name);
DROP INDEX CONCURRENTLY old_index_name;
ALTER INDEX new_index_name RENAME TO old_index_name;

請注意,使用此方法意味著您會暫時擁有相同索引的兩個副本,因此如果磁碟空間是個問題,您可能需要採取其他方法。

跳過一個或多個更新版本的使用者可能需要執行其他更新後步驟;有關詳細資訊,請參閱早期版本的版本說明。

連結