PostgreSQL 每週新聞 - 2021 年 5 月 9 日

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

PostgreSQL 每週新聞 - 2021 年 5 月 9 日

本週人物:https://postgresql.life/post/dave_page/

PostgreSQL 產品新聞

pgBackRest 2.33 發布,這是一個適用於 PostgreSQL 的備份和恢復系統。https://pgbackrest.org/release.html#2.33

pg_probackup 2.4.15 發布,這是一個用於管理 PostgreSQL 資料庫叢集備份和恢復的工具。https://github.com/postgrespro/pg_probackup/releases/tag/2.4.15

五月份的 PostgreSQL 工作

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

PostgreSQL 新聞

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

PostgreSQL 每週新聞由 David Fetter 本週為您帶來

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

已應用的修補程式

Alexander Korotkov 推送了

Amit Kapila 推送了

Peter Eisentraut 推送了

Tom Lane 推送了

  • 修正在新的 regex 比對所有 (match-all) 偵測程式碼中的效能問題。Commit 824bf7190 引入了對 regex 編譯產生的 NFA 的新搜尋。我沒有仔細考慮該搜尋的效能特性,結果可想而知:奇怪的 regex 可能會觸發指數級的搜尋時間。更糟的是,該程式碼中沒有中斷檢查 (check-for-interrupt),因此如果發生這種情況,您甚至無法取消查詢。透過引入搜尋結果的記憶化 (memo-ization) 來解決此問題,以便每個 NFA 狀態只需詳細檢查一次。這可能會使用大量記憶體,但是我們可以透過限制我們嘗試證明全部比對 (match-all-ness) 的狀態數量來限制記憶體使用量。這是合理的,因為我們已經對 matchall regex 可以比對的最大有限字串長度設定了限制 (DUPINF);並且涉及遠多於 DUPINF 狀態的模式也可能超出該限制。另外,重新排列邏輯,以便我們在開始遞迴搜尋以確定路徑長度之前,先檢查基本的 graph- all-RAINBOW-arcs 屬性。這將確保只要 NFA 不可能全部比對 (matchall),我們就能快速脫離。並且加入中斷檢查 (check-for-interrupt),以防萬一這些措施不能完全消除速度慢的風險。討論:https://postgr.es/m/3483895.1619898362@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/f68970e33f4dc48094c24c78c452ad730ae9ae12

  • 停用快取覆蓋 (clobber) 以避免破壞 postgres_fdw 終止測試。Commit 93f414614 改進了先前存在的測試案例,使其能夠顯示是否發生了「遠端」工作行程的終止。這很快就暴露了,當 debug_invalidate_system_caches_always (先前稱為 CLOBBER_CACHE_ALWAYS) 啟用時,不會發生這種終止。這是因為快取失效 (cache invalidation) 會強制在交易結束時丟棄 postgres_fdw 連線,因此沒有工作行程可以終止。在我們查看之前,工作行程是否能夠退出 BackendStatusArray 存在競爭條件,但至少在 buildfarm 成員 hyrax 上,它已經在兩次嘗試中失敗了兩次。與其重新「腦白質切除」這個測試,不如透過暫時停用 debug_invalidate_system_caches_always 來修復它。(可喜的是,現在它只是一個 GUC,而不是編譯時選項。)如果這證明不足以使測試穩定,我們可以改為做另一件事。討論:https://postgr.es/m/3854538.1620081771@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1273a15bf91fa322915e32d3b6dc6ec916397268

  • Doc: 改進並集中 OID 別名類型的文件。以前,關於 type regclass 的大量資訊僅存在於 sequence 函式的討論中。也許一開始這是有道理的,因為我認為最初那些是唯一採用 regclass 的函式。但是現在沒有意義了。將該資料移至 datatype.sgml 中的「物件識別碼類型」章節,將其推廣到其他 reg* 類型,並添加更多範例。根據 Federico Caselli 的 bug #16991。討論:https://postgr.es/m/16991-bcaeaafa17e0a723@postgresql.org https://git.postgresql.org/pg/commitdiff/f33a178a34809a2bae7a5f4c00984d87771f4204

  • Doc: 更新 RELEASE_CHANGES 檢查清單。更新檢查清單以反映當前實踐:特定於平台的 FAQ 檔案早已消失。我們也從未例行更新我們借用的 libbind 程式碼,並且現在似乎沒有理由開始更新。說明每個週期運行 pgindent 兩次的當前實踐。討論:https://postgr.es/m/4038398.1620238684@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e8ce68b0b9ae2757c6153a88bf869904d2d5ac0b

  • Doc: 微小的措辭調整。改進自引用外鍵範例,根據 David Johnston 的建議。討論:https://postgr.es/m/CAKFQuwZTke7+HUn4YUGqu2+gAPi4Cy18TXMrg_Z5nADkxfPNMw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/c38cadc0907a8d071b043b2b32b83efa09db38ea

  • Doc: debug_invalidate_system_caches_always 描述的文字編輯。我來修復 "useful only useful",但當我越看文字時,我發現有更多可以改進的地方。 https://git.postgresql.org/pg/commitdiff/f9b809e7fbe36cd3fe1ce33edb277288a31da386

  • 將 guc.c 和 postgresql.conf.sample 與 SGML 文件同步。似乎有人在 config.sgml 清單中四處移動 GUC,而沒有費心讓程式碼一致。確保分配給 GUC 的 config_group 代碼與它們在 config.sgml 中列出的位置匹配。同樣,確保 postgresql.conf.sample 以與它們在 config.sgml 中顯示的相同的子章節和相同的順序列出 GUC。(我對其中一些選擇有些懷疑,但就此補丁而言,我們將 config.sgml 視為真理。)值得注意的是,這需要添加 WAL_RECOVERY config_group 值,因為 1d257577e 沒有添加。只要我們無論如何都要重新編號該枚舉,讓我們刪除與分為子群組的主要群組相對應的值。不應將任何 GUC 分配給主要群組本身,因此這些值只會誘使您做錯事,同時增加翻譯人員的工作。順便一提,調整 PRESET_OPTIONS GUC 的 short_desc 字串,以統一使用措辭 "Shows XYZ.",消除了其中一些字串留下的您可以設定該值的印象。儘管其中一些錯誤是舊的,但沒有回溯修補 (back-patch),因為在穩定分支中更改 pg_settings 視圖的內容似乎更有可能被視為相容性中斷,而不是任何有幫助的事情。Bharath Rupireddy、Justin Pryzby、Tom Lane 討論:https://postgr.es/m/16997-ff16127f6e0d1390@postgresql.org 討論:https://postgr.es/m/20210413123139.GE6091@telsasoft.com https://git.postgresql.org/pg/commitdiff/a55a98477b690dedb9b4368d7e5710c8e7fa534e

Robert Haas 推送了

Bruce Momjian 推送了

Álvaro Herrera 推送了

Andres Freund 推送了

Peter Geoghegan 推送了

Thomas Munro 推送了

Tomáš Vondra 推送了

Andrew Dunstan 推送了

Michaël Paquier 推送了

David Rowley 推送了

  • 移動 Result Cache 程式碼的記憶體記帳斷言。在 9eacee2e6 中,我加入了一些程式碼,透過計算條目的數量以及每次從快取中逐出某些內容時它們使用的記憶體來驗證快取的記憶體追蹤是否正確。然後使用 Assert 將這些值與預期值進行比較。問題是這需要每次從快取中逐出一個條目時,都迴圈遍歷整個快取雜湊表。正如 Pavel Stehule 指出的那樣,這可能會非常昂貴。在這裡,我們移動了這個記憶體記帳檢查程式碼,以便我們僅在關閉 Result Cache 節點時在 cassert 建置上驗證它一次。除了效能提升之外,這還有兩個明顯的優點:1) 我們在銷毀快取之前的最後一刻執行記憶體檢查。這意味著我們現在將捕獲在快取逐出後可能偷偷潛入的記帳問題。2) 我們現在在沒有快取逐出時執行記憶體 Assert 檢查。這增加了覆蓋範圍。一個小缺點是,我們現在將錯過在執行結束時以某種方式自行解決的任何記憶體追蹤問題。但是,在我看來,這樣的記憶體追蹤問題不太可能發生,而且如果存在,可能會稍微不那麼有害。順便提一下,調整迴圈遍歷雜湊表,以使用標準的 simplehash.h 迭代方法。回報者:Pavel Stehule 討論:https://postgr.es/m/CAFj8pRAzgoSkdEiqrKbT=7yG9FA5fjUAP3jmJywuDqYq6Ki5ug@mail.gmail.com https://git.postgresql.org/pg/commitdiff/92c4c269d24d016c19858a21347ff25a7de1f486

待處理的修補程式

Aleksander Alekseev 送出了另一個修訂版的修補程式,以允許 CustomScan 節點發出投影支援的訊號。

Melanie Plageman 送出了另一個修訂版的修補程式,以避免對剛建置的索引立即進行 fsync。

Dilip Kumar 送出了兩個修訂版的修補程式,以添加 TOAST 壓縮方法選項。

Vigneshwaran C 送出了另外四個修訂版的修補程式,以在 CREATE/ALTER SUBSCRIPTION 期間識別來自發布者的遺漏發布。

Bertrand Drouvot 送出了一個修補程式,旨在透過完全複製來源資料庫中最舊的Xid限制,來修復一個錯誤,該錯誤表現為 pg_upgrade 可能導致具有高交易負載的資料庫提前環繞。

Bertrand Drouvot 提交了一個補丁,旨在修正一個因孤立依賴關係而產生的錯誤。該補丁透過新增一個名為 DirtyCatalogSnapshot 的目錄快照,並由一個名為 UseDirtyCatalogSnapshot 的新變數控制,來檢查正在進行中的依賴關係,並取得物件的描述以產生錯誤訊息。

Thomas Munro 提交了另一個補丁修訂版,旨在 src/test/recovery 下新增一個新的 TAP 測試,以使用串流複本重播 WAL 的方式來執行標準迴歸測試。這為 WAL 解碼和重做程式碼提供了一個基本的測試。

Mark Dilger 提交了兩個補丁修訂版,旨在擴展 amcheck 以檢查 TOAST 大小和壓縮。

Jeff Davis 提交了一個補丁,以系統預期的方式限制表格 AM 中的 ItemPointer。

Dilip Kumar 和 Kyotaro HORIGUCHI 交換了補丁,旨在修正一個在恢復過程中出現的競爭條件錯誤。

Craig Ringer 提交了另一個補丁修訂版,使 Valgrind 的執行更簡單,只需使用 make USE_VALGRIND=1。

David Fetter 提交了一個補丁,以闡明 pg_constraint 中的一些欄位描述。

Vigneshwaran C 又提交了兩個補丁修訂版,旨在列印指定 postgres 程序的堆疊追蹤。

Craig Ringer 提交了一個補丁,用於在 probes.d 探針被停用時發出虛擬陳述式。

Jeff Davis 提交了另一個補丁修訂版,旨在實作 ALTER TABLE ... SET ACCESS METHOD。

Amit Langote 提交了一個補丁,以闡明 ALTER TABLE ... DETACH PARTITION CONCURRENTLY 的文件。

Etsuro Fujita 提交了一個補丁,用於修正 EXPLAIN ANALYZE 對於非同步節點的錯誤。

Etsuro Fujita 提交了一個補丁,用於描述非同步執行在 FDW 中的運作方式。

Nitin Jadhav 提交了一個補丁,用於實作多欄位的列表分割。

Yugo Nagata 提交了另一個補丁修訂版,旨在實作增量視窗維護。

Konstantin Knizhnik 提交了另一個補丁修訂版,用於移除不必要的自我聯結。

Andrey Borodin 提交了另一個補丁修訂版,以加速 GiST 索引的建立。

Etsuro Fujita 提交了一個補丁,透過修改 postgresPlanDirectModify() 使其清除 async-capable 標誌(如果已設定),來修正繼承的 UPDATE/DELETE 和非同步執行之間的不協調之處。

James Coleman 提交了一個補丁,用於並行化在每個 worker 中執行的相關子查詢。

Jeff Janes 提交了一個補丁,用於在嚴重檢查之前新增配置快取檢查點。

Hou Zhijie 提交了另一個補丁修訂版,用於修正 EXPLAIN 關於 FDW 批次插入的資訊。

Erik Rijkers 和 Alexander Korotkov 交換了補丁,以改進 JSON 路徑查詢中的範例,以強調實際發生的事情。

Bruce Momjian 提交了另一個補丁修訂版,用於修正區間算術中的錯誤行為。

Hou Zhijie 提交了一個補丁,用於修正當 fdw batch_size 設置為 0 時,出現不準確錯誤訊息的錯誤。

David Rowley 提交了另一個補丁修訂版,用於加速具有一組常數的 NOT IN()。

Andrew Dunstan 提交了另一個補丁修訂版,用於實作 SQL/JSON 的 JSON_TABLE 部分。

Andrew Dunstan 提交了另一個補丁修訂版,用於實作 SQL/JSON 中的函數。

Tom Lane 提交了一個補丁,用於建立一個二進位可強制轉換的 C 函數,以便減少 CLOBBER_CACHE_ALWAYS 下 opr_sanity 測試的執行時間。

David Rowley 提交了一個補丁,僅在計劃關閉時驗證 resultcache 記憶體。

Vigneshwaran C 提交了一個補丁,用於修正邏輯複製訊息格式的資料類型。