PostgreSQL 每週新聞 - 2021 年 10 月 3 日

發佈於 2021-10-04,作者:PWN
PWN

PostgreSQL 每週新聞 - 2021 年 10 月 3 日

PostgreSQL 14 已發布! https://postgres.tw/about/news/postgresql-14-released-2318/

PostgreSQL 產品新聞

pgtt 2.6,一個用於實現全域臨時表的擴充套件,已發布。 https://github.com/darold/pgtt/releases/tag/v2.6

oracle_fdw 2.4.0 已發布。 https://laurenz.github.io/oracle_fdw

pgFormatter 5.1,一個用於 SQL 程式碼的格式化器/美化器,已發布。 https://github.com/darold/pgFormatter/blob/master/ChangeLog

十月份的 PostgreSQL 工作

https://archives.postgresql.org/pgsql-jobs/2021-10/

PostgreSQL 新聞

Planet PostgreSQL:https://planet.postgresql.org/

本週的 PostgreSQL 每週新聞由 David Fetter 帶給您

請在太平洋標準時間/太平洋夏令時間星期日下午 3:00 前將新聞和公告提交至 david@fetter.org。

已套用的補丁

Thomas Munro 推送

Peter Geoghegan 推送

Michaël Paquier 推送

Tom Lane 推送

  • 重新啟用 contrib/bloom 的 TAP 測試。 這些測試早在 2018 年 (commit d3c09b9b1) 就因為在建置農場中觀察到的失敗而被停用。 但是,我一直無法在 longfin 的主機上重現任何失敗,所以我很好奇我們在多大程度上解決了這個問題。 讓我們重新啟用它 (僅在 HEAD 中) 並看看會發生什麼。 討論:https://postgr.es/m/2769443.1632773967@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7d1aa6bf1c27bf7438179db446f7d1e72ae093d0

  • 修正 contrib/bloom TAP 測試中的不穩定性。事實證明,commit d3c09b9b 中所抱怨的不穩定性,其解釋非常簡單。測試腳本等待備用伺服器將傳入的 WAL 刷新到磁碟,但它應該等待 WAL 被重播,因為我們正在測試該重播是否會產生可見的影響。同時,使用 wait_for_catchup 而不是重新發明該邏輯,並調整 $Test::Builder::Level 以改善未來的錯誤報告。向後移植到 v12,因為必要的基礎結構是在該版本中引入的 (參見上述 commit)。同時也向後移植 7d1aa6bf1,以便實際運行該測試。討論:https://postgr.es/m/2854602.1632852664@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/6bc6bd47cf715c8717a8af3f617957045772d38b

  • 將 ETIMEDOUT 視為指示無法恢復的連線故障。將 ETIMEDOUT 加入 ALL_CONNECTION_FAILURE_ERRNOS 的清單中,作為 "識別先前建立的網路連線硬故障的錯誤代碼"。儘管可以想像有時這是可以恢復的,但其他條目(例如 ENETDOWN)也是如此。為了支持這一點,在相關的基礎結構(例如 TranslateSocketError())中,以與其他 socket 錯誤相同的方式處理 ETIMEDOUT。(我也在 TranslateSocketError() 中做了一些外觀上的調整。)現在程式碼假設 ETIMEDOUT 在任何地方都有定義,鑑於 POSIX 自 SUSv2 以來就已經要求這樣做。也許應該向後移植這個修改,但我猶豫是否要這樣做,因為之前沒有任何抱怨,而且重新定義符號會在 Windows 上產生輕微的 ABI 破壞的風險。即使我們決定這樣做,也最好先在 HEAD 中測試一段時間。Jelte Fennema 討論:https://postgr.es/m/AM5PR83MB01782BFF2978505F6D6C559AF7AA9@AM5PR83MB0178.EURPRD83.prod.outlook.com https://git.postgresql.org/pg/commitdiff/b484ddf4d2eb81736512efa35ed3e5d2a72993d8

  • 移除 002_types.pl 測試中不必要的環境依賴性。透過減去 "N 天" 來計算相關的時間戳記,會受到目前時區的影響,因為我們將其解釋為 "在第 N 天之前同一當地時間"。即使所涉及的間隔只有兩到四天,但由於非常不幸地跨越了 2014 年齋月結束的日子,如果時區設定為 Africa/Casablanca,會導致測試輸出發生變化。(可能在其他穆斯林地區也是如此;我沒有檢查。)這個測試絕對沒有理由去執行間隔減法,所以只需擺脫它,並使用表示預期值的純 timestamptz 常數即可。根據 Andres Freund 的報告。向後移植到 v10,因為這個測試腳本是在該版本中引入的。討論:https://postgr.es/m/20210930183641.7lh4jhvpipvromca@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/20f8671ef69b864c25ffa59471814102c1260d78

  • 修正 Portal 快照追蹤,以正確處理子交易。Commit 84f5c2908 忘記考慮 EnsurePortalSnapshotExists 可能在 lifespan 短於 Portal 的子交易中運行的可能性。在這種情況下,新的活動快照將在子交易結束時被彈出,在 Portal 中留下懸空的指標,導致混亂。為了修正這個問題,請確保 ActiveSnapshot 堆疊條目標記的子交易嵌套層級與相關 Portal 的相同。這樣做絕對是安全的,因為除非堆疊為空,否則我們根本不會來到這裡;因此,我們無法建立一個亂序的堆疊。同時,讓我們也在 PortalRunUtility 設定 portalSnapshot 的情況下應用這個邏輯,以確保該路徑不會導致類似的問題。不太清楚該路徑是否會建立一個亂序的堆疊,所以新增一個斷言來保護它。由 Bertrand Drouvot 報告和修補(經過我的評論)。向後移植到 v11,就像之前的 commit 一樣。討論:https://postgr.es/m/ff82b8c5-77f4-3fe7-6028-fcf3303e82dd@amazon.com https://git.postgresql.org/pg/commitdiff/7b5d4c29ed0262e537026cb3a85161d6cf98abcc

  • 避免在 get_variable_range() 中信任不完整的僅 MCV 統計資料。get_variable_range() 會不小心地相信僅包含 MCV 清單的統計資料足以得出範圍估計值。對於僅包含 MCV 的枚舉類型欄位來說還可以,但除此之外,估計值可能會非常糟糕。除非 MCV 加上 nullfrac 佔據整個表格,否則讓它報告範圍是不確定的。我不認為這需要一個專門的測試案例,因為快速的程式碼涵蓋率檢查可以驗證現有的迴歸測試會遍歷所有替代方案。無論如何,很難建立一個面向未來的測試案例,因為提交的範例在 v11 之前意外地沒有失敗。根據 Simon Perepelitsa 的錯誤 #17207。向後移植到 v10。原則上,這一直是壞的,但我猶豫是否要在 9.6 中進行這樣的更改,因為如果有人對 9.6.24 的行為不滿意,將沒有第二次機會修復它。討論:https://postgr.es/m/17207-5265aefa79e333b4@postgresql.org https://git.postgresql.org/pg/commitdiff/8c1144ba73478b818d9cebe8ecd64a14b7d45bde

  • 重新按照字母順序排列 win32_tzmap[] 陣列。最初的意圖似乎是按 Windows 區域名稱不區分大小寫地排序,但多年來的各種更改並未遵循該備忘錄。此 commit 只是移動了一些條目以恢復精確的字母順序,以便更容易地與處理腳本的輸出進行比較。向後移植到所有支援的分支,這是我們更新時區資料的慣例做法。討論:https://postgr.es/m/3266414.1633045628@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ad740067aea5b643ca2f79da086808573d35b5f4

  • 更新我們使用 CLDR 資訊的 Windows 時區名稱對應。這修正了 win32_tzmap[] 中的一些條目,並根據 CLDR 專案的 windowsZones.xml 檔案新增了一些新條目。非外觀上的變更主要分為四個類別: * 明顯的錯誤: US/Aleutan 不存在 America/Salvador 不存在 Asia/Baku 對於 Yerevan 是錯誤的 Asia/Dhaka (孟加拉國) 對於 Astana (哈薩克) 是錯誤的 Europe/Bucharest 對於 Chisinau 是錯誤的 America/Mexico_City 對於 Chetumal 是錯誤的 America/Buenos_Aires 對於 Cayenne 是錯誤的 America/Caracas 有自己的時區,因此不適合 La Paz US/Eastern 對於海地是錯誤的 US/Eastern 對於印第安納州 (東部) 是錯誤的 Asia/Karachi 對於塔什干是錯誤的 Etc/UTC+12 不存在 Etc/GMT 時區的符號是反向的 * 判斷性決定: (這些變更遵循 CLDR 的選擇,除了第一個) 使用 Europe/London 作為 "Greenwich Standard Time",因為這似乎比 Africa/Casablanca 更可能是人們認為該時區名稱的含義。CLDR 在這裡使用 Atlantic/Reykjavik,但也好不到哪裡去。 Asia/Shanghai 似乎比香港更適合 "China Standard Time"。 Europe/Sarajevo 現在是貝爾格萊德的連結,即 "Central Europe Standard Time";因此使用 Warsaw 作為 "Central European Standard Time"。 America/Sao_Paulo 似乎比 Araguaina 更能代表 "E. South America Standard Time"。 Africa/Johannesburg 似乎比 Harare 更能代表 "South Africa Standard Time"。 * 新的 Windows 時區名稱: "Israel Standard Time" "Kaliningrad Standard Time" "Russia Time Zone N" 對於不同的 N "Singapore Standard Time" "South Sudan Standard Time" "W. Central Africa Standard Time" "West Bank Standard Time" "Yukon Standard Time" 其中一些替換了舊的拼寫,但我保留了舊的拼寫,以防我們的程式碼在具有舊資料的機器上運行。 * 將別名 (tzdb Links) 替換為底層的城市名稱時區: (這遵循 tzdb 長期的做法,並減少與其他條目以及 CLDR 的不一致性。) US/Alaska Asia/Kuwait Asia/Muscat Canada/Atlantic Australia/Canberra Canada/Saskatchewan US/Central US/Eastern US/Hawaii US/Mountain Canada/Newfoundland US/Pacific 回溯修補到所有支援的分支,這是我們通常對時區資料更新的做法。 討論: https://postgr.es/m/3266414.1633045628@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/9b8d68cc6589814d121344f59e927a7e4506fb8c

  • 修正 plpgsql 中 RETURN QUERY 命令的查詢類型檢查。 在 v14 之前,我們堅持 RETURN QUERY 中的查詢必須是返回元組的類型。(例如,允許 INSERT RETURNING,但不允許普通的 INSERT。) 這是間接發生的,因為我們為查詢開啟了一個游標,因此 spi.c 檢查了 SPI_is_cursor_plan()。 因此,錯誤訊息並不是特別到位,但至少它在那裡。 Commit 2f48ede08 遺失了這個細節。 相反,普通的 RETURN QUERY 堅持查詢必須是 SELECT (透過檢查 SPI_OK_SELECT),而 RETURN QUERY EXECUTE 完全沒有檢查查詢類型。 這些變更都不是有意的。 在 EXECUTE 案例中檢查此問題的唯一方便的地方是在 _SPI_execute_plan 內部,因為我們在那之前沒有進行過語法分析。 因此,我們需要傳遞一個標誌來說明是否強制查詢返回元組。 幸運的是,我們可以在不中斷 ABI 的情況下將另一個布林值擠入 struct SPIExecuteOptions 中,因為那裡有填充空間。(不太可能有任何擴充程式已經在使用這個新的結構,但在 v14 中保留 ABI 似乎是一個明智的想法。) 在 spi.c 內部,似乎 _SPI_execute_plan 的參數列表已經非常荒謬,我不想讓它更長。 因此,我考慮將 SPIExecuteOptions 按原樣傳遞下去,允許該參數列表變得更短。 這使得這個修補程式比其他情況更具侵入性,但這一切都在 spi.c 內部,所以這似乎沒問題。 根據 Marc Bachmann 的報告。 回溯修補到出現錯誤程式碼的 v14。 討論: https://postgr.es/m/1F2F75F0-27DF-406F-848D-8B50C7EEF06A@gmail.com https://git.postgresql.org/pg/commitdiff/a0558cfa395b47adb245972f5eba7978461e7baa

Peter Eisentraut 推送了

Magnus Hagander 推送了

Fujii Masao 推送了

Álvaro Herrera 推送了

  • 修正不完整紀錄存在時的 WAL 重播問題。實體複製總是會在 WAL 區段檔完成後,立即將它們傳送到副本。如果一個 WAL 紀錄跨越了區段邊界,而且主要伺服器在寫入包含該 WAL 紀錄的下一部分的區段之前崩潰,就會產生問題:崩潰恢復後的 WAL 寫入會很高興地從損壞紀錄開始的地方繼續,覆寫該紀錄...但是任何備用伺服器或備份伺服器可能已經收到該區段的副本,而且它們不會回溯。這會導致備用伺服器在主要伺服器崩潰後停止追隨主要伺服器:LOG: invalid contrecord length 7262 at A8/D9FFFBC8,因為備用伺服器仍然試圖讀取原始長 WAL 紀錄的連續紀錄 (contrecord),但是它不存在,而且永遠不會存在。一個權宜之計是停止副本,刪除 WAL 檔案,然後重新啟動它--此時會從主要伺服器攜帶一份全新的副本。但這相當費力,而且我敢打賭很多使用者會直接放棄並重新複製備用伺服器。commit 515e3d84a0b5 已經嘗試修復這個問題,但它只解決了 WAL 歸檔的情況,因此串流複製仍然會是一個問題(以及其他事情,例如在伺服器崩潰後關閉時進行檔案系統層級的備份),而且它也存在效能擴充性的問題;因此它必須被還原。這個 commit 使用 Andres Freund 建議的方法來修正這個問題,即保留分割的 WAL 紀錄的初始部分,並在遺失 contrecord 的地方寫入一種特殊的 WAL 紀錄,以便副本中的 WAL 重播知道跳過損壞的部分。使用這種方法,我們可以繼續在區段檔完成後立即串流/歸檔它們,並且損壞紀錄的重播將順利地跨越崩潰點進行。因為新增了一種新的 WAL 紀錄類型,使用者應該小心先升級備用伺服器,然後再升級主要伺服器。否則,如果主要伺服器碰巧寫入這樣的紀錄,他們可能會面臨備用伺服器無法啟動的風險。新增了一個 TAP 測試來練習這個問題,但它的可移植性還有待觀察。這個問題自從引入實體複製以來就一直存在,所以回溯所有版本。在穩定分支中,將新的 XLogReaderState 成員保留在結構體的末尾,以避免 ABI 中斷。作者:Álvaro Herrera alvherre@alvh.no-ip.org 審閱人:Kyotaro Horiguchi horikyota.ntt@gmail.com 審閱人:Nathan Bossart bossartn@amazon.com 討論:https://postgr.es/m/202108232252.dh7uxf6oxwcy@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/ff9f111bce24fd9bbca7a20315586de877d74923

  • 修復新測試的兩個可移植性疏忽。首先,正如 Tom Lane 和 Michael Paquier 指出的那樣,我沒有意識到 Windows 的 PostgresNode 需要額外的 pg_hba.conf 行(由 PostgresNode->set_replication_conf 添加,當給定 'allows_streaming=>1' 時,由 ->init() 在內部呼叫 -- 但我特意省略了這一點)。我認為一個好的修復方法是也為僅設定 'has_archiving=>1' 的節點設定複製,但這是一個更大的討論。通過呼叫 ->set_replication_conf 來修復它,正如 Andrew Dunstan 指出的那樣,這並非前所未聞。我也忘記取消註釋針對可泵 IPC::Run 檔案描述器的 ->finish() 呼叫。顯然,這在幾乎所有平台上都是無害的。回溯到 14。較舊的分支也添加了這個檔案,但沒有添加這個測試的特定部分。討論:https://postgr.es/m/3000074.1632947632@sss.pgh.pa.us 討論:https://postgr.es/m/YVT7qwhR8JmC2kfz@paquier.xyz https://git.postgresql.org/pg/commitdiff/d03bca4d70c29cca4f09e3a0e78a56cf97e237f3

  • 移除不穩定、不必要的測試;修正錯字。Commit ff9f111bce24 添加了一些不可移植且沒有添加有意義覆蓋範圍的測試程式碼。移除它,而不是嘗試讓它在所有地方都能工作。同時,修復上述 commit 添加的日誌訊息中的錯字。回溯到 14。討論:https://postgr.es/m/3000074.1632947632@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/d186d233dfde4afb9dff346e13c8adaf4deec6b3

  • 如果同時指定 SKIP LOCKED 和 WITH TIES,則產生錯誤。Bug #16676[1] 和 #17141[2] 都說明了當涉及返回給訪問同一行的其他會話的行時,SKIP LOCKED 和 FETCH FIRST WITH TIES 的組合打破了預期。由於這種情況可以從語法中檢測到,並且很難以其他方式修復,因此目前禁止使用,並有可能在將來修復。[1] https://postgr.es/m/16676-fd62c3c835880da6@postgresql.org [2] https://postgr.es/m/17141-913d78b9675aac8e@postgresql.org Backpatch-through: 13,WITH TIES 在此版本中引入。作者:David Christensen david.christensen@crunchydata.com 討論:https://postgr.es/m/CAOxo6XLPccCKru3xPMaYDpa+AXyPeWFs+SskrrL+HKwDjJnLhg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/c6bc655ee2ef09449da7ff688a8be19a13db5c4a

David Rowley 推送

Amit Kapila 推送

Daniel Gustafsson 推送

Andres Freund 推送