PostgreSQL 每週新聞 - 2020 年 12 月 6 日

發表於 2020-12-07 由 PWN
PWN

PostgreSQL 每週新聞 - 2020 年 12 月 6 日

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

PostgreSQL 產品新聞

check_pgactivity 2.5,用於監控 PostgreSQL 的 Nagios 遠端代理程式,已發布。 https://github.com/OPMDG/check_pgactivity/releases/latest

WAL-G 0.2.19,一個用 Go 编写的 PostgreSQL 備份管理系統,已發布。 https://github.com/wal-g/wal-g/releases

十二月的 PostgreSQL 工作

http://archives.postgresql.org/pgsql-jobs/2020-12/

PostgreSQL 新聞報導

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

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

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

== 已應用修補程式 ==

Tom Lane 推送了

  • 修復最近在 psql 的 \connect 命令中引入的損壞。由於我誤讀了現有程式碼的實際作用,提交 85c54287a 等打破了 psql 對於「\c connstring」在 connstring 中提供密碼的情況的行為。在這種情況下,我們應該使用該密碼,但自 85c54287a 以來,我們忽略了它(而是提示輸入密碼)。提交 94929f1cf 在 HEAD 中修復了此問題,但由於我認為它是在清理長期存在的錯誤行為,而不是我剛剛創建的錯誤,因此我沒有反向修補它。因此,反向修補 94929f1cf 中與密碼管理相關的部分。除了修復引入的錯誤之外,這意味著「\c -reuse-previous=on connstring」將允許重複使用現有連線的密碼,如果 connstring 沒有變更使用者/主機/連接埠。之前沒有發生過這種情況,但這似乎是一個錯誤修復,無論如何,我不願讓這個程式碼在各個版本之間存在顯著差異。同時也修正了關於是否覆寫 connstring 的 client_encoding 設定的相同根本原因的錯誤。從 85c54287a 開始,我們總是這樣做;恢復之前的行為,僅當 stdin/stdout 是終端機且沒有 PGCLIENTENCODING 環境設定時才覆寫。(我發現這個定義有點令人驚訝,但現在似乎不是重新審視它的時候。)每個來自 Krzysztof Gradek 的錯誤 #16746。與之前的修補程式一樣,反向修補到所有支援的分支。討論:https://postgr.es/m/16746-44b30e2edf4335d4@postgresql.org https://git.postgresql.org/pg/commitdiff/7e5e1bba034ee02245e8a3833aa1f6ea7253b584

  • 修復聯結關係的 direct_lateral_relids 的錯誤計算。如果 PlaceHolderVar 要在聯結關係中評估,但其值僅在該處需要,而不在更高層級需要,我們忽略了更新 joinrel 的 direct_lateral_relids 以包含 PHV 的來源 rel。這會導致問題,因為 join_is_legal() 隨後將不允許將 joinrel 完全聯結到 PHV 的來源 rel,從而導致「未能建立任何 N 向聯結」的規劃器失敗。每個來自 Andreas Seltenreich 的報告。反向修補到問題最初出現的 9.5。討論:https://postgr.es/m/87blfgqa4t.fsf@aurora.ydns.eu https://git.postgresql.org/pg/commitdiff/b1738ff6ab73203cbbc02d7fb82941dbc061d301

  • 防止在獨立後端中並行建立索引。如果沒有 postmaster,這將無法工作,並且程式碼確實得到了斷言失敗的嘗試。應該檢查 IsUnderPostmaster 來閘控並行性的使用,就像規劃器對於普通並行查詢一樣。提交 40d964ec9 做對了,所以遵循其模型,在我們檢查 max_parallel_maintenance_workers == 0 的相同位置檢查 IsUnderPostmaster。通常,實現並行實用程式操作的新程式碼應該執行相同的操作。由 Yulin Pei 報告和修補,由我進行了外觀上的調整。反向修補到此程式碼進入的 v11。討論:https://postgr.es/m/HK0PR01MB22747D839F77142D7E76A45DF4F50@HK0PR01MB2274.apcprd01.prod.exchangelabs.com https://git.postgresql.org/pg/commitdiff/275b3411d9189b3974687766db06727d64d22979

  • 移除 configure-time 對於 DocBook DTD 的探測。當我們使用 OpenSP 文件工具鏈時,檢查是否已安裝 DocBook 是有價值的,因為很難完全安裝它。如今,只要您安裝了 xmllint 和 xsltproc,您就可以了,因為這些程式會根據需要從網路上獲取 DocBook 檔案。此外,在配置時測試這意味著無論您是否對稍後建立文件感興趣,都可能發生網路存取。這可能很慢(通常是 2 或 3 秒,但據報導有更高的延遲),並且在沒有警告的情況下進行離線機器訪問似乎不太好。因此,刪除 PGAC_CHECK_DOCBOOK 探測,並調整相關文件。沒有該巨集,config/docbook.m4 幾乎沒有剩下什麼,所以我只是刪除了它。反向修補到 v11,我們開始在 PGAC_CHECK_DOCBOOK 探測中使用 xmllint。討論:https://postgr.es/m/E2EE6B76-2D96-408A-B961-CAE47D1A86F0@yesql.se 討論:https://postgr.es/m/A55A7FC9-FA60-47FE-98B5-139CDC57CE6E@gmail.com https://git.postgresql.org/pg/commitdiff/4823c4f6ac770ebd49b63b0ce64ecfe82987af57

  • 修復 IncrementalSortPath 缺少 outfuncs.c 支援的問題。為了除錯的目的,Path 節點應該具有 outfuncs 支援,但在原始的增量排序修補程式中忽略了這一點。同時,清理一些其他小疏忽,以及 create_incremental_sort_path() 的奇怪的回傳類型選擇。(所有現有的呼叫者都只是將其立即轉換為「Path *」,因此他們不在乎,但未來的某些呼叫者可能會在乎。) Zhijie Hou 的 outfuncs.c 修復,其餘的由我修復 討論:https://postgr.es/m/324c4d81d8134117972a5b1f6cdf9560@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/8286223f3d820c39f2d5f14222f7ccde53bdf502

  • 確保 expandTableLikeClause() 重新檢查相同的資料表。如同先前的狀況,expandTableLikeClause() 重新執行了 transformTableLikeClause() 已經執行過的 relation_openrv 呼叫。然而,在某些情況下,這可能無法找到預期中的相同資料表。我們持有 LIKE 來源資料表的鎖定,因此它無法被重新命名或刪除,但另一個資料表可能會在搜尋路徑中出現在它之前。這解釋了在將資料表複製為同名的暫時資料表時,錯誤 #16758 中回報的奇怪行為。在 commit 502898192 引入需要開啟來源資料表兩次之前,這個案例如預期般運作,因此我們應該修正它。為了真正確保我們得到相同的資料表,讓我們透過 OID 而非名稱重新開啟它。這需要將 OID 欄位添加到 struct TableLikeClause 中,這從 ABI 的角度來看有點令人不安,但只要它在結尾,我認為沒有任何嚴重的風險。根據 Marc Boeren 的錯誤 #16758。與之前的 patch 一樣,回溯修補到所有支援的分支。討論:https://postgr.es/m/16758-840e84a6cfab276d@postgresql.org https://git.postgresql.org/pg/commitdiff/f7f83a55bf6051818a0e4387d718867ecfa8561b

  • 修正 planner 中移除無用 RESULT RTEs 時遺漏的步驟。Commit 4be058fe9 忘記在我們移除無用 result RTEs 時,append_rel_list 已經被填充,並且它可能包含需要像主 parse tree 中的 PlaceHolderVars 一樣調整的項目。這可能會導致稍後在 planner 嘗試對未調整的 PHV 執行某些操作時出現「relid N 沒有關係條目」的錯誤。根據 Tom Ellis 的報告。回溯修補到引入此錯誤的 v12 版本。討論:https://postgr.es/m/20201205173056.GF30712@cloudinit-builder https://git.postgresql.org/pg/commitdiff/e98c900993e89ad9278cdfbf0ba5495381a1faac

Fujii Masao 推送

Heikki Linnakangas 推送

Michaël Paquier 推送了

  • 重構 EXPLAIN、VACUUM 和 ANALYZE 的選項列表的解析規則。這三個命令一直使用相同的語法規則來處理帶括號的選項列表。此舉重構了代碼,使它們使用相同的解析規則,減少了一些代碼。未來的 commit 將使用這些選項解析規則來處理更多實用程式命令,例如 REINDEX 和 CLUSTER。作者:Alexey Kondratov, Justin Pryzby 討論:https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru https://git.postgresql.org/pg/commitdiff/873ea9ee692e7829614f913685db540b17998ba6

  • doc: 移除更多關於與過去版本相容性的注意事項。這是 fa42c2e 中完成的工作的後續,它沒有包括先前約定的所有修復。此處刪除的內容可能會讓讀者感到困惑,因為它們指的是相當舊的伺服器版本。作者:Stephen Frost, Tom Lane, Heikki Linnakangas, Yaroslav Schekin 討論:https://postgr.es/m/CAB8KJ=jYHgnxLLZSNJz7gBTck4TxomngCmGkw3nEMSNF0yL6wA@mail.gmail.com 討論:https://postgr.es/m/1599765595731-0.post@n3.nabble.com https://git.postgresql.org/pg/commitdiff/8a17f44c1e7a9f3d2a9da97dc3eba4184a2a453c

  • 將 SHA2 例程移至用於加密雜湊的新通用 API 層。創建了兩個新的例程來分配雜湊上下文並釋放它,因為這些對於此重構背後的目標變得必要:切換 OpenSSL 的所有加密雜湊實現以使用 EVP(為了 FIPS,也因為 upstream 不建議使用低階加密雜湊函數 20 年)。請注意,自 1.1.0 以來,OpenSSL 隱藏了加密雜湊上下文的內部結構,因此有必要將分配留給 OpenSSL 本身,這解釋了對這兩個新例程的需求。這部分將需要更多的工作來正確追蹤具有資源所有者的雜湊上下文,但此處未引入。儘管如此,此重構使移動成為可能。這通過將雜湊類型直接合併到雜湊上下文資料中,將所有 SHA2 實現的例程數量從 12 個(SHA{224,256,386,512} 及其 init、update 和 final 呼叫)減少到 5 個(create、free、init、update 和 final 呼叫)。新的加密雜湊例程被移動到一個名為 cryptohash.c 的新檔案中,用於 fallback 實現,其中 SHA2 特性成為 src/common/ 的內部部分。OpenSSL 特性是 cryptohash_openssl.c 的一部分。此基礎結構可用於更多雜湊類型,例如 MD5 或 HMAC。使用內部 SHA2 例程的任何代碼路徑都進行了調整,以正確報告錯誤,這是此 commit 的大部分更改。受影響最大的區域是 checksum manifest、libpq 和 SCRAM。請注意,e21cbb4 是第一次嘗試將 SHA2 切換到 EVP,但它缺少 libpq 所需的重構,如這裡所做的那樣。此 patch 已在 Linux 和 Windows 上使用和不使用 OpenSSL 進行測試,並降至 1.0.1,這是 HEAD 上支援的最舊版本。作者:Michael Paquier 審閱者:Daniel Gustafsson 討論:https://postgr.es/m/20200924025314.GE7405@paquier.xyz https://git.postgresql.org/pg/commitdiff/87ae9691d25379785f8c0f81b06a14818cfd8c56

  • 修正 cryptohash_openssl.c 中的編譯警告。這些警告在使用 -O2 時出現。87ae969 中的疏忽。作者:Fujii Masao 討論:https://postgr.es/m/cee3df00-566a-400c-1252-67c3701f918a@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/91624c2ff8809145880383b0fa84be0ee98f55b5

  • 重構 CLUSTER 和 REINDEX 語法以使用 DefElem 作為選項列表。此更改使 CLUSTER 和 REINDEX 允許使用帶括號的語法作為選項,同時將選項列表的語法解析規則與現有的規則統一起來。這是針對 VACUUM、ANALYZE 和 EXPLAIN 在 873ea9e 中完成的工作的後續。這有利於 REINDEX,可以潛在地針對排序規則敏感的索引和 TABLESPACE 進行後端過濾,而 CLUSTER 將從後者中受益。作者:Alexey Kondratov, Justin Pryzby 討論:https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru https://git.postgresql.org/pg/commitdiff/b5913f6120792465f4394b93c15c2e2ac0c08376

  • 基於 OpenSSL 的 SHA2 實作變更為使用 EVP 摘要例程。自 2000 年以來,上游 OpenSSL 不建議使用底層雜湊例程,且 pgcrypto 已自 5ff4a67 起切換為 EVP。這利用了 87ae969 中完成的重構,該重構引入了密碼編譯雜湊的分配和釋放例程。自 1.1.0 起,OpenSSL 不再發佈 cryptohash 上下文的內容,強制所有消費者都依賴 OpenSSL 進行所有分配。因此,資源擁有者回調機制獲得了一組新的例程,用於追蹤和釋放在使用 OpenSSL 時的 cryptohash 上下文,從而防止後端出現洩漏的風險。由於 87ae969 的重構,前端不需要任何操作,並且資源擁有者的知識被隔離到 cryptohash_openssl.c 中。請注意,這也修復了在使用 OpenSSL 中的 FIPS 時 SCRAM 身份驗證失敗的問題,但由於關於此問題的投訴很少,並且這會導致 ABI 中斷,因此沒有進行向後移植。作者:Michael Paquier 審閱人:Daniel Gustafsson, Heikki Linnakangas 討論:https://postgr.es/m/20200924025314.GE7405@paquier.xyz 討論:https://postgr.es/m/20180911030250.GA27115@paquier.xyz https://git.postgresql.org/pg/commitdiff/4f48a6fbe2b28d8281dbbfa2d334fa2ed8472734

  • 將 cryptohashes.c 重新命名為 cryptohashfuncs.c。87ae969 在 src/common/ 中創建了兩個新檔案,名為 cryptohash{_openssl}.c,其名稱與現有的後端檔案 cryptohashes.c 重疊,該檔案專用於 SHA2 和 MD5 的 SQL 封裝器。此檔案被重新命名為 cryptohashfuncs.c,以更符合周圍的環境並減少與 src/common/ 的新 cryptohash 介面的混淆。作者:Michael Paquier 審閱人:Daniel Gustafsson 討論:https://postgr.es/m/X8hHhaQgbMbW+aGU@paquier.xyz https://git.postgresql.org/pg/commitdiff/bd94a9c04e04bb3b626e88981a50fcca2bd99d60

Álvaro Herrera 推送

Thomas Munro 推送

Bruce Momjian 推送

Stephen Frost 推送

Dean Rasheed 推送

  • 使用擴充統計資料來改善 OR 子句的估算。先前,我們只將擴充統計資料應用於 OR 子句,作為 clauselist_selectivity() 程式碼路徑的一部分,用於隱含 AND 列表中的 OR 子句。這意味著它只能在 OR 子句的所有子句都由單一擴充統計物件涵蓋時,才能使用擴充統計資料。現在,我們教導 clause_selectivity() 如何將擴充統計資料應用於 OR 子句,以類似於處理隱含 AND 列表的方式處理其 OR 子句列表,但組合規則不同。這允許使用一個或多個擴充統計物件來估算所有或部分子句列表。任何剩餘的子句則被視為獨立的。此外,為了避免重複應用擴充統計資料,引入了 clause_selectivity() 和 clauselist_selectivity() 的 "extended" 版本,其中包含忽略擴充統計資料的選項。這取代了舊的 clauselist_selectivity_simple() 函數,該函數在從擴充統計資料程式碼呼叫時,無法完全忽略擴充統計資料。目前基礎架構的一個已知限制是,OR 子句下的 AND 子句不被視為與擴充統計資料相容(因為我們沒有為此類子 AND 子句建立 RestrictInfos)。因此,例如,"(a=1 AND b=1) OR (a=2 AND b=2)" 目前將被視為兩個獨立的 AND 子句(每個子句都可以使用擴充統計資料進行估算),但目前不會使用擴充統計資料來解釋這些子句之間可能存在的任何重疊。改進這一點將留待未來處理。原始修補程式由 Tomas Vondra 提供,並由我進行額外改進。討論:https://postgr.es/m/20200113230008.g67iyk4cs3xbnjju@development https://git.postgresql.org/pg/commitdiff/25a9e54d2db31b8031c2d8166114b187e8347098

Peter Eisentraut 推送

Amit Kapila 推送

  • 移除 reorderbuffer.c 中不正確的斷言。我們甚至在達到 SNAPBUILD_CONSISTENT 狀態之前就開始在 ReorderBufferTXN 中記錄變更,以便如果在達到該狀態後遇到 commit,我們應該能夠傳送整個交易的變更。現在,在記錄變更時,如果重新排序緩衝區記憶體超過 logical_decoding_work_mem,如果允許並且我們尚未串流該資料,我們可以開始串流。但是,除非快照已達到 SNAPBUILD_CONSISTENT 狀態,否則我們絕不允許開始串流。順便一提,改進 ReorderBufferResetTXN 頂部的註解,以提及在收到錯誤後需要繼續串流的情況。作者:Amit Kapila 審閱人:Dilip Kumar 討論:https://postgr.es/m/CAA4eK1KoOH0byboyYY40NBcC7Fe812trwTa+WY3jQF7WQWZbQg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8ae4ef4fb0e0331f02c4615182600546c8e5c4d4

== 待處理的修補程式 ==

Tatsuro Yamada 提交了另一個修訂版本的修補程式,以將 \dX(擴充統計資料)新增至 psql。

Andrey V. Lepikhov 提交了另一個修訂版本的修補程式,以移除不必要的自我連接。

David G. Johnston 提交了另一個修訂版本的修補程式,以對 plpgsql 文件進行一些小清理和重述。

Seino Yuki 提交了另一個修訂版本的修補程式,以將一個新欄位 reset-time 新增到 pg_stat_statements_info

Justin Pryzby 提交了一個修補程式,以使 \dt+ pg_toast.* 在 psql 中工作。

Justin Pryzby 提交了另一個修訂版本的修補程式,以使 EXPLAIN 在非文字格式中顯示 JIT 詳細資訊,即使為零也是如此。

Peter Eisentraut 提交了另一個修訂版本的修補程式,以暫停恢復,因為參數設定不足。

Michaël Paquier 提交了另一個修訂版本的修補程式,以修復一個錯誤,該錯誤表現為如果 pg_database tuple 包含 toast 屬性,則 vac_update_datfrozenxid 將引發「錯誤的 tuple 長度」。

Michaël Paquier 提交了另一個修訂版本的修補程式,以移除對長期過時行為的一些參考。

Peter Geoghegan 提交了另一個修訂版本的修補程式,以教導 heapam 支援自下而上的索引刪除,傳遞「邏輯上未更改的索引」提示,並教導 nbtree 使用自下而上的索引刪除。

Bertrand Drouvot 提交了兩個修訂版本的修補程式,以防止函數因刪除包含它們的 schema 而變成孤立的。

Andrey V. Lepikhov 提交了一個修補程式,以修復對外部連接成本的過度高估。

Konstantin Knizhnik 提交了另一個修訂版本的修補程式,以實作 libpq 的自訂壓縮。

Álvaro Herrera 提交了一個修補程式,以改進拼寫為 INDEX CONCURRENTLY 的操作。

Peter Eisentraut 提交了另一個修訂版本的修補程式,以使 pageinspect 將區塊編號參數變更為 bigint,因為這實際上符合 uint32。

Aleksey Kondratov、Michaël Paquier 和 Justin Pryzby 交易了修補程式,以允許 CLUSTER 和 VACUUM FULL 即時變更 tablespace。

Bertrand Drouvot 和 Fujii Masao 交易了修補程式,以記錄備用恢復衝突等待。

Justin Pryzby 提交了另外兩個修訂版本的修補程式,以使 INSERT SELECT 能夠使用 BulkInsertState。

Bharath Rupireddy 提交了另外兩個修訂版本的修補程式,以使 CREATE TABLE AS 能夠使用平行插入。

James Coleman 提交了另一個修訂版本的修補程式,如果 gather merge 路徑沒有充分排序,則會產生錯誤。

James Coleman 提交了另一個修訂版本的修補程式,以確保 generate_useful_gather_paths 不會跳過未排序的子路徑,在 generate_useful_gather_paths 中強制執行 pathkeys 的並行安全性,不允許在主動排序中使用 SRF,移除 volatile expr 目標搜尋,並記錄 prepare_sort_from_pathkeys 中的 find_em_expr_usable_for_sorting_rel

Craig Ringer 送出了一個 patch,實作了一個 TAP 測試工具模組 PG_LSN.pm,用來測試涉及邏輯序列號碼的東西。

Greg Nancarrow 送出了另一個版本的 patch,新增一個可報告的 GUC 參數 in_hot_standby,並使 transaction_read_only GUC 參數可報告,同時增強了連線參數 target_session_attrs 以支援新值:read-only/primary/standby/prefer-standby。

Jürgen Purtz 送出了另一個版本的 patch,在教學文件中加入更明確的 JOIN 語法。

Zhihong Yu 送出了另一個版本的 patch,用來檢查定義索引時的 nparts 參數。

Hou Zhejie 送出了一個 patch,將 plan_union_children() 中的 lcons 和 list_delete_first,替換為 lappend 和 list_delete_last

Laurenz Albe 送出了一個 patch,如果在 psql 的 \e 中退出編輯器,則丟棄查詢緩衝區。

Andres Freund 送出了一個 patch,修復了 LLVM 12 造成的 JIT 問題。

Fujii Masao 送出了另一個版本的 patch,將基本統計資訊添加到 pg_stat_wal view 中。