PostgreSQL 每週新聞 - 2021 年 4 月 25 日

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

PostgreSQL 每週新聞 - 2021 年 4 月 25 日

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

PostgreSQL 產品新聞

JDBC 42.2.20 已發布 https://jdbc.postgresql.org/documentation/changelog.html#version_42.2.20

kubgres 1.1 已發布。kubgres 是一個 Kubernetes operator,可以部署配置了複製和故障轉移的 PostgreSQL pod 集群。 https://github.com/reactive-tech/kubegres/releases/tag/v1.1

pspg 4.6.1 已發布。pspg 是一個專為 PostgreSQL 設計的分頁器。 https://github.com/okbob/pspg/releases/tag/4.6.1

pgAdmin4 5.2 已發布。pgAdmin4 是一個用於 PostgreSQL 的基於 Web 和原生 GUI 的控制中心。 https://www.pgadmin.org/docs/pgadmin4/5.2/release_notes_5_2.html

pg_log_statements 0.2 已發布。pg_log_statements 是一個擴展,可以記錄特定伺服器進程的語句。 https://github.com/pierreforstmann/pg_log_statements/releases

四月份 PostgreSQL 職缺

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

PostgreSQL 新聞

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

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

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

已套用的 Patch

Thomas Munro 推送了

Michaël Paquier 推送了

Amit Kapila 推送

Peter Eisentraut 推送

Peter Geoghegan 推送

  • 在 VACUUM 中記錄 LP_DEAD 會計問題。記錄 VACUUM 的軟假設,即在剪除期間遇到的任何 LP_DEAD 項目將在 VACUUM 完成之前變成 LP_UNUSED 項目。這對於 VACUUM 用於產生其關於該表給統計資訊收集器的最終報告的會計至關重要。它也影響 VACUUM 如何確定哪些堆積頁面是可截斷的。在這兩種情況下,VACUUM 都關心該頁面在不久的將來可能包含的內容,而不是該頁面當前包含的內容。這種情況造成了一種錯誤的印象,即 VACUUM 的死元組會計與 ANALYZE 期間使用的類似會計存在顯著差異。至少在軟假設完全奏效的情況下,不存在實質性差異。現在這要清晰得多。還記錄了 VACUUM 的死元組會計無法完全奏效的情況。 VACUUM 可能會留下大量的 LP_DEAD 項目,並且不會在 VACUUM 的統計資訊收集器報告中記錄為剩餘的死元組。這種行為可以追溯到 commit a96c41fe,該 commit 教導 VACUUM 在用戶請求時無需執行索引和堆積清理。 commit 1e55e7d1 最近新增到 VACUUM 的故障保護機制採用了相同的死元組會計方法。報告人:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAH2-Wz=Jmtu18PrsYq3EvvZJGOmZqSO2u3bvKpx9xJa5uhNp=Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/7136bf34f28892362144ae2e350714836a5c0c0c

  • amcheck:MAXALIGN() nbtree 特殊區域偏移量。這不是絕對必要的,但從理論上講,如果將來 nbtree 特殊區域的寬度發生變化,這可能會很重要——即使進行了填充,其總大小也可能不是 MAXALIGN() 量子的偶數倍。 PageInit() MAXALIGN() 所有特殊區域偏移量,但是 amcheck 使用該偏移量對行指針執行初始基本驗證,因此我們不依賴於頁面標頭中的偏移量。 這樣做的真正原因是為新增其他索引 AM 的 amcheck 覆蓋率的新程式碼樹立一個好榜樣。報告人:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 討論:https://postgr.es/m/CALj2ACUMqTR9nErh99FbOBmzCXE9=gXNqhBiwYOhejJJS1LXqQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bb3ecc8c961896ecb2ad3d5ba705c2877b933945

Magnus Hagander 推送

Andrew Dunstan 推送了

Tom Lane 推送了

Bruce Momjian 推送

Álvaro Herrera 推送

  • 在分離分割區時,不要新增冗餘約束。在 ALTER TABLE .. DETACH CONCURRENTLY 上,我們新增一個新的表約束,該約束複製了分割區約束。但是,如果分割區已經有另一個隱含該約束的約束,則這是沒有必要的。如果存在完全「相等」的匹配,我們已經避免添加重複的約束 - 這只是提高了檢查的品質。作者:Justin Pryzby pryzby@telsasoft.com 審閱者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/20210410184226.GY6592@telsasoft.com https://git.postgresql.org/pg/commitdiff/7b357cc6ae553c0ecacdc11b2e5278b7bf477dba

  • 新增關於 extract_autovac_opts 不持有鎖定的註解。根據 Tom Lane 的觀察。討論:https://postgr.es/m/1901125.1617904665@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7c298c6573a0f181963ddcb40c850fa9c7da0ada

  • 修復分割區分離中的 relcache 不一致風險。在來自 ri_triggers.c 的查詢期間,我們需要省略標記為 pending detach 的分割區 - 否則,RI 查詢會被欺騙,允許將一行插入到引用表中,而該行對應的行位於分離的分割區中。這是錯誤的:一旦分離操作完成,該行將成為孤立行。但是,該程式碼在 repeatable-read 交易中沒有這樣做,因為 relcache 保留了分割區描述符的副本,其中包括分割區,並在 RI 查詢中使用它。此 commit 變更了 partdesc 快取程式碼,使其僅保留不依賴於快照的描述符 (即:不存在已分離分割區的描述符,以及包含已分離分割區的描述符)。當請求沒有已分離分割區的 partdesc 時,我們會每次都重新建立一個;此外,這些 partdesc 儲存在 PortalContext 中,而不是 CacheMemoryContext 中。find_inheritance_children 獲得一個新的輸出*detached_exist 布林值,表示是否找到任何標記為 pending-detach 的分割區。它的 "include_detached" 輸入旗標已變更為 "omit_detached",因為該名稱更自然地捕捉了所需的語意。CreatePartitionDirectory() 和 RelationGetPartitionDesc() 的引數已進行相同的重新命名。這是因為一個使用 relcache clobbering 運行的建置伺服器成員 (它不會保留不正確快取的 partdesc) 破壞了一個測試,這使我們意識到該測試的預期輸出是錯誤的。此 commit 也更正了該預期輸出。作者:Amit Langote amitlangote09@gmail.com 作者:Álvaro Herrera alvherre@alvh.no-ip.org 討論:https://postgr.es/m/3269784.1617215412@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/8aba9322511f718f12b618470d8c07f0ee5f0700

  • 修復未初始化記憶體錯誤。讓感興趣的 find_inheritance_children 呼叫者在呼叫它之前將 detached_exist 值設定為 false,以便該常式僅在必要時(很少發生)才必須將其設定為 true。否則不要觸碰它。根據建置伺服器成員 thorntail(它在此處報告了 UBSan 失敗)。 https://git.postgresql.org/pg/commitdiff/43b55ec4bc3bc06596d966391f16defe016310ec

Etsuro Fujita 推送

Fujii Masao 推送

  • doc: 修復關於 pg_basebackup 的過時描述。先前的文件記載,如果使用 "-X none" 選項,則無法保證在從備份伺服器進行備份時,pg_basebackup 結束時所有需要的 WAL 檔案都已封存。但是此限制已由 commit 52f8a59dd9 移除。現在,即使從備份伺服器進行備份,pg_basebackup 也可以等待所有需要的 WAL 檔案都已封存。因此,此 commit 從文件中刪除了此類過時的描述。此外,此 commit 還新增了關於從備份伺服器進行備份時的限制的新描述到文件中。限制是 pg_basebackup 無法強制備份伺服器在備份結束時切換到新的 WAL 檔案,這可能導致 pg_basebackup 等待很長時間才能切換和封存最後需要的 WAL 檔案,尤其是在主伺服器上的寫入活動較低時。向後移植到引入問題的 v10。回報者:Kyotaro Horiguchi 作者:Kyotaro Horiguchi, Fujii Masao 審閱者:Kyotaro Horiguchi, Fujii Masao 討論:https://postgr.es/m/20210420.133235.1342729068750553399.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/eaec48b3c54eec222d64468b57af80ee4ddf76a9

  • 將 gram.y 和 parsenodes.h 中的 COMPRESSION 選項重新排序為字母順序。Commit bbe0a81db6 在 CREATE TABLE 命令中引入了 "INCLUDING COMPRESSION" 選項,但之前 gram.y 和 parsenodes.h 中的 TableLikeOption 並未按照字母順序對這個新選項進行分類。作者:Fujii Masao 審閱者:Michael Paquier 討論:https://postgr.es/m/YHerAixOhfR1ryXa@paquier.xyz https://git.postgresql.org/pg/commitdiff/3f20d5f37086e548c32ddb9d6ae09c2e1ce300ce

Alexander Korotkov 推送了

Noah Misch 推送了

待處理的 Patches

Peter Smith 發送了一個 patch 以重新排列 CREATE SUBSCRIPTION 的選項列表。

Bharath Rupireddy 發送了另一個版本的 patch,以新增用於多重和單一插入的新資料表 AM,並將其用於 CTAS、REFRESH MATERIALIZED VIEW 和 COPY。

Amul Sul 發送了另外兩個版本的 patch,以從 transformCreateStmt 中移除多餘的變數。

Pavel Stěhule 發送了另一個版本的 patch,使其可以在 auto_explain 中記錄 seqscans。

David Rowley 發送了另一個版本的 patch,以減少 Windows 上 contrib 建置的特殊情況數量。

Amul Sul 發送了另外兩個版本的 patch,以新增 RelationGetSmgr 內聯函數。

Masahiko Sawada 發送了另外兩個版本的 patch,以跳過凍結元組插入的 vmbuffer。

Dagfinn Ilmari Mannsåker 發送了一個 patch,用於建立一個函數,以從表達式中剝離 RelabelType 節點,將許多相同的模式合併為一個。

Masahiko Sawada 和 Amit Kapila 交換了 patch,以將 HTAB 用於複製槽統計資訊。

Vigneshwaran C 和 Amit Kapila 交換了 patch,以在複製槽釋放期間更新解碼統計資訊。

Bharath Rupireddy 發送了一個 patch,以在 lazy_truncate_heap 中的鎖定等待使用 WaitLatches,在 do_pg_stop_backup 中使用 WaitLatches 而不是 pg_usleep(),以及用於身份驗證前和身份驗證後延遲。

Bharath Rupireddy 發送了一個 patch,以將 parallel_leader_participation GUC 移至資源消耗類別。

Peter Smith 發送了另外兩個版本的 patch,以將對預備交易的支持新增到內建邏輯複製,並新增對串流交易的 prepare API 支持。

Dan Carter 發送了一個 patch,以將 GSSAPI ccache_name 選項新增到 libpq。

Takamichi Osumi 和 Amit Kapila 交換了 patch,以修復 TRUNCATE 和同步邏輯複製之間的不協調。

Amit Langote 發送了一個 patch,以修復 pgoutput 外掛程式中的 tupdesc 洩漏。

Bharath Rupireddy 發送了一個 patch,以跳過重複關係的 VACUUM/ANALYZE。

Pavel Stěhule 發送了另一個版本的 patch,以將 PSQL_WATCH_PAGER 設定新增到 psql。

Masahiro Ikeda 發送了另一個版本的 patch,以在不引入新變數的情況下,在報告 WAL 統計資訊方面做出一些效能改進。

Fujii Masao 發送了另外四個版本的 patch,以記錄 TRUNCATE 在外部資料表上的工作方式,並確保原始查詢中的任何 ONLY 子句都不會傳遞到相同資料表。

Hou Zhijie 發送了一個 patch,以修復具有錯誤並行安全標誌的測試案例。

Zeng Wenjing 發送了另一個版本的 patch,以實作全域暫存資料表。

Simon Riggs 發送了一個 patch,以記錄將約束變更為 VALIDATE 它需要 SHARE UPDATE EXCLUSIVE 鎖定的事實。

Simon Riggs 發送了一個 patch,以在允許 CHECK 約束為 NOT VALID 時降低鎖定層級。

Daniil Zakhlystov 發送了另一個版本的 patch,以新增 zlib 和 zstd 串流壓縮,並實作 libpq 壓縮。

Tom Lane 發送了一個 patch,以更好地記錄 Julian 日期。

Álvaro Herrera 發送了一個 patch,以將 ALTER TABLE .. DETACH PARTITION CONCURRENTLY 的 Tab 補全新增到 psql。

Tom Stellard 發送了一個 patch,讓 jit 能夠處理 s390x 上潛在的資料佈局不匹配。

Justin Pryzby 發送了一個 patch,以在執行 CREATE TABLE ... LIKE 時新增 COMPRESSION 作為一種可能性。

Kyotaro HORIGUCHI 發送了一個 patch,以修復一些可疑的訊息。

Tang 發送了一個 patch,以在使用 psql 比較 "pg_" 時使用 pg_strncasecmp 來替換 strncmp。

Tang 發送了另一個版本的 patch,以支持 psql 中大寫字元輸入的 Tab 補全。

Hou Zhijie 發送了另一個版本的 patch,使其可以並行執行 INSERT SELECT。

Mark Dilger 和 Robert Haas 交換了 patch,以將 toast 指標損壞檢查新增到 pg_amcheck。

Bharath Rupireddy 發送了一個 patch,以 MAXALIGN sizeof(BTPageOpaqueData) 在 PageGetItemIdCareful 中。

Ajin Cherian 發送了另一個版本的 patch,以跳過邏輯複製的空交易。

Alexander Pyhalov 發送了另一個版本的 patch,以將 restrictinfo 推送到 CTE,並嘗試在此過程中修剪分割區。

Thomas Munro 發送了一個 patch,以在 src/test/recovery 下新增一個新的 TAP 測試,該測試使用 wal_consistency_checking=all 執行迴歸測試。

Joel Jacobson 發送了一個 patch,以修復事件觸發器的 pg_identify_object_as_address。

Takamichi Osumi 發送了一個 patch,以將 ReorderBufferProcessTXN 中 RelationIsLogicallyLogged 的檢查替換為具有相同效果的 Assert。

David Rowley 發送了另一個版本的 patch,透過允許使用雜湊表來加速具有一組 Consts 的 NOT IN()。

David Rowley 和 Yura Sokolov 交換了 patch,以在 SMgr 中使用 simplehash.h 而不是 dynahash。

Julien Rouhaud 發送了一個 patch,以修復 query_id 計算中的一些疏忽。

Tom Lane 發送了一個 patch,要求 pq_getmessage 的呼叫者提供長度上限,並在伺服器中安裝與 libpq 具有的相同的短訊息與長訊息的啟發式方法。