PostgreSQL 9.6.1、9.5.5、9.4.10、9.3.15、9.2.19 和 9.1.24 已發布!

發布於 2016-10-27,由 PostgreSQL Global Development Group

PostgreSQL Global Development Group 已發布我們資料庫系統所有受支援版本的更新,包含 9.6.1、9.5.5、9.4.10、9.3.15、9.2.19 和 9.1.24。 這也是 PostgreSQL 9.1 系列的最後一個更新,因為它現在已終止支援 (end-of-life)。 此版本修復了兩個可能導致資料損毀的問題,詳細說明如下。 它也修補了過去三個月報告的許多其他錯誤。 專案小組強烈建議使用者在下次可能的停機時間套用此更新。

已截斷關聯的 WAL 記錄

在此版本之前,PostgreSQL 實例有可能嘗試存取磁碟上不再存在的資料。 如果未更新可用空間對應表以識別截斷,則 PostgreSQL 資料庫可能會傳回已截斷的頁面,並產生類似以下的錯誤:

ERROR:  could not read block 28991 in file "base/16390/572026": read only 0 of 8192 bytes

如果啟用了總和檢查碼,也可能發生可見性對應表中的總和檢查碼失敗。

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

大端機器上的 pg_upgrade 問題

在大端機器上 (例如,許多非 Intel CPU 架構),pg_upgrade 會錯誤地寫入可見性對應表的位元組,導致 pg_upgrade 無法完成。

如果您使用的是大端機器(許多非 Intel 架構都是大端)並且已使用 pg_upgrade 從 9.6 之前的版本升級,則應假定所有可見性對應表都不正確,需要重新產生。 使用 contrib/pg_visibility 的 pg_truncate_visibility_map() 函數截斷每個關聯的可見性對應表就足夠了。 請閱讀「更新」部分,了解有關如何在 PostgreSQL 實例上解決此問題的安裝後說明。

此問題僅存在於 PostgreSQL 9.6.0 版本中。

錯誤修正和改進

除了上述內容之外,此更新還修復了過去幾個月報告的許多錯誤。 其中一些問題僅影響 9.6 系列,但許多問題會影響所有受支援的版本。 此版本提供了超過 50 個修復,包含

  • 修復使用 DISTINCT 執行聚合函數時的 use-after-free 風險,這可能導致崩潰
  • 修復用作視窗函數的多型聚合的不正確處理,這可能導致崩潰
  • 修復在大端機器上不正確建立 GIN 索引 WAL 記錄的問題
  • 修復截斷超過 1GB 的臨時關聯時的檔案描述符洩漏
  • 修復在具有 PRIMARY KEY 或 REPLICA IDENTITY 索引的表上執行大量 UPDATE 時的查詢生命週期記憶體洩漏
  • 修復 SELECT FOR UPDATE/SHARE 以正確鎖定已由隨後中止的交易更新的元組
  • 修復從啟用資料列級別安全性的表中,使用欄位名稱清單的 COPY
  • 修復在取消 INSERT ... ON CONFLICT 時投機性插入的 TOAST 元組的刪除
  • 修復 VACUUM 等待獨佔表鎖以截斷表時的逾時時間長度
  • 修復在建立或變更表時合併繼承的 CHECK 約束中的錯誤
  • 修復 jsonb_set() 中陣列元素的替換
  • 修復中止在 btree 索引中使用縮寫鍵時可能發生的排序錯誤
  • 在 Windows 上,在發生拒絕存取錯誤後,重試建立動態共享記憶體控制區段
  • 修復 pgbench 的平均延遲計算
  • 使 pg_receivexlog 在沒有插槽的情況下也能正確地使用 --synchronous
  • 使 pg_rewind 在來源伺服器上的工作階段中關閉 synchronous_commit
  • 不要嘗試在 libpq 中跨多個連線共享 SSL 內容
  • 支援 OpenSSL 1.1.0
  • 安裝 TAP 測試基礎設施,以便可用於擴充功能測試
  • 針對邏輯 WAL 解碼和複製插槽的一些修復
  • 針對 pg_dump、pg_xlogdump 和 pg_upgrade 中一些小問題的修復
  • 針對查詢規劃器和 EXPLAIN 輸出中一些小問題的修復
  • 針對時區支援的一些修復

此更新還包含 tzdata 版本 2016h,用於巴勒斯坦和土耳其的 DST 法律變更,以及土耳其和俄羅斯某些地區的歷史修正。 切換為南極洲、前蘇聯和斯里蘭卡某些時區的數字縮寫。

IANA 時區資料庫先前為所有時區提供文字縮寫,有時會捏造在當地居民中很少或沒有流通的縮寫。 他們正在反轉該政策,轉而使用在沒有證據表明實際使用英語縮寫的區域中使用數字 UTC 偏移量。 至少目前,PostgreSQL 將繼續接受此類已刪除的縮寫以進行時間戳記輸入。 但它們不會顯示在 pg_timezone_names 檢視表中,也不會用於輸出。

在此更新中,AMT 不再顯示為用於表示亞美尼亞時間。 因此,我們已變更預設縮寫集,將其解釋為亞馬遜時間,即 UTC-4 而不是 UTC+4。

9.1 版本終止支援公告

PostgreSQL 9.1 版本現在已終止支援 (EOL)。 社群將不會為此版本發布任何額外的更新或安全性修補程式。 仍在使用 9.1 的使用者應盡快升級。 請參閱我們的版本控制政策 (https://postgres.tw/support/versioning/) 以獲取更多資訊。

更新

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

如果您的系統受到大端 pg_upgrade 錯誤的影響,請閱讀 Visibility Map Problems 並按照說明操作,了解如何在 PostgreSQL 實例上修復此問題。

跳過一個或多個更新版本的使用者可能需要執行額外的更新後步驟; 請參閱早期版本的發布說明以了解詳細資訊。

連結