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

發佈於 2020-12-27,作者:PWN
PWN

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

PostgreSQL 產品新聞

Pgpool-II 4.2.1 發布,這是一個用於 PostgreSQL 的連接池和語句複製系統。https://www.pgpool.net/docs/42/en/html/release-4-2-1.html

Postgres Operator v1.6.0 發布。https://github.com/zalando/postgres-operator

12 月的 PostgreSQL 工作機會

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

PostgreSQL 新聞

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

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

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

已應用的補丁

Tom Lane 推送了

  • 文件:修正了如何使用 src/tutorial 檔案的描述。在提交 ed1939332 中新增的在調用 psql 之前單獨執行 "cd" 命令是有道理的(或者至少我是這麼認為的)。但是 4e3a61635 移除了解釋何時使用它的支持文本,使其令人困惑。所以刪除它。同時,將路徑未提供部分從四個點改為三個點,因為至少有一人將四個點誤讀為 "../.." 的錯誤。並修正 these/those 的不一致。討論:https://postgr.es/m/160837647714.673.5195186835607800484@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/eea1e08cfc95bb7e1b7e9f515e73cf75adf147e3

  • 移除 "jsonb 物件的無效連接" 錯誤案例。 jsonb || jsonb 運算符任意拒絕了標量和非標量輸入的某些組合,同時願意連接其他組合。這當然是沒有記錄的。與其嘗試記錄它,不如直接移除這個限制,創建一個統一的規則:除非我們正在處理物件到物件的連接,否則非陣列輸入會被轉換為單元素陣列,從而導致陣列到陣列的連接。(這不會改變以前未拋出錯誤的任何案例的行為。)根據 Joel Jacobson 的投訴。回溯修補到所有支援的分支。討論:https://postgr.es/m/163099.1608312033@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ff5d5611c01f60525c30b2c3ebc16d05edb7956d

  • 增加 021_row_visibility.pl 中的超時時間。提交 7b28913bc 認為 30 秒對於任何人來說都足夠長了,但在像 valgrind 運行這樣的環境中,這不一定足夠。https://git.postgresql.org/pg/commitdiff/08dde1b3dc78e90e01f3af8e89ab27ed37cd8963

  • 改進 autoprewarm 對於早期關閉情境的處理。如果在 DBA 發出 "pg_ctl stop -m fast" 命令,而 autoprewarm 尚未完成加載要預熱的區塊列表時,會發生不好的事情。當前的工作程序成功地提前終止,但是(如果這不是最後一個具有要預熱的區塊的資料庫),主導程序將嘗試為下一個資料庫啟動另一個工作程序。由於 postmaster 現在處於 PM_WAIT_BACKENDS 狀態,因此它會忽略啟動請求,並且主導程序只是坐著直到它被手動殺死。這主要是由於我們對於啟動背景工作程序的不完善的設計造成的,但是對於它的正確修復可能太具有侵入性,無法進行回溯修補。為了改善這種情況,請修復 apw_load_buffers() 以在嘗試啟動另一個工作程序之前檢查是否已收到 SIGTERM。這使我們在每次工作程序啟動中只有一個非常狹窄的視窗,在此期間 SIGTERM 可能發生在啟動請求和成功的工作程序啟動之間。另一個問題是,如果主導程序確實設法退出,它會無條件地使用當前在共享緩衝區中的區塊來重寫 autoprewarm.blocks,從而忘記了我們在預熱時尚未到達的任何區塊。這似乎沒有幫助,因為下一個資料庫啟動將不會獲得預期的預熱好處。修復它,以便如果我們在初始加載嘗試完成之前關閉,則不修改該檔案。根據 John Thompson 提出的錯誤 #16785。回溯修補到引入 autoprewarm 代碼的 v11。討論:https://postgr.es/m/16785-c0207d8c67fb5f25@postgresql.org https://git.postgresql.org/pg/commitdiff/ff769831e081a4e69147019128a849ced43ec802

  • 改進對於立即停止情境的客戶端錯誤消息。到目前為止,如果 DBA 發出 "pg_ctl stop -m immediate" 命令,則發送給客戶端的消息與崩潰並重新啟動情境的消息相同。這令人困惑,尤其因為該消息聲稱資料庫將很快再次啟動,而我們無權預測這一點。改進此情況,以便我們可以為這兩種情況生成不同的消息(並且還可以識別臨時 SIGQUIT,如果有人嘗試這樣做的話)。為此,請向 pmsignal.c 的共享記憶體數據結構添加一個欄位,postmaster 在將 SIGQUIT 廣播給其子程序之前設置該欄位。似乎不需要互鎖;中間的信號發送和信號接收應足以序列化對該欄位的訪問。因此,這並不比 pmsignal.c 的現有用法更危險。我們將來可能會擴展這個想法,以改進其他 postmaster 到子程序的信號情境,儘管目前沒有任何一個像 SIGQUIT 那樣嚴重超載。討論:https://postgr.es/m/559291.1608587013@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7e784d1dc191be24480a6b31a4ddc8e0e52be24d

  • 修復關閉和未啟動的背景工作程序之間的競爭條件。如果在某些程序決定請求新的背景工作程序的時間和 postmaster 可以啟動該工作程序的時間之間,命令了資料庫關閉(智能或快速),則不會發生任何事情,因為 postmaster 在退出 PM_RUN 狀態後不會啟動任何 bgworker。這很好……除非請求程序正在等待該工作程序完成(甚至等待它啟動);在這種情況下,請求者被卡住,只有手動干預才能使我們能夠關閉。為了修復,請在 postmaster 發送信號關閉 (SIGTERM) 時取消對工作程序的待處理請求,類似地取消此後收到的任何新請求。(我們可以稍微優化一下,僅對具有等待者的工作程序執行取消。)為了適應現有的 bgworker API,"取消" 類似於工作程序已啟動並立即停止,從而導致取消註冊 bgworker 條目。等待程序無論如何都必須處理工作程序提前退出,因此這不應引入之前不存在的錯誤。我們有一個副作用,即對於可重新啟動的 bgworker 的註冊記錄可能會在理論上應保持原位時消失;但是由於我們正在關閉,因此這無關緊要。回溯修補到 v10。也可能將其放入 9.6 中,但是那裡的 bgworker 管理有點不同(尤其是參見 8ff518699),並且我不相信值得努力驗證該分支的補丁。討論:https://postgr.es/m/661570.1608673226@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7519bd16d1a2a2007b3604f6740611c0b75a6cd0

  • 避免日誌輪換測試中出現與時間相關的故障。Buildfarm 成員 pogona 和 petalura 在 pg_ctl/t/004_logrotate.pl 於午夜前啟動時出現故障。預設的午夜輪換行為發生在 Perl 腳本檢查 current_logfiles 之前,因此它認為已經請求的輪換已經發生... 但實際上,該輪換發生在檢查之後,因此預期的新日誌資料會進入與它正在檢查的文件不同的文件中。在 HEAD 中,src/test/kerberos/t/001_auth.pl 已經獲得了類似的程式碼,顯然具有相關的故障模式。除了是相當新的程式碼之外,很少有 buildfarm 參與者運行該測試,因此我們尚未在那裡看到故障也就不足為奇了。透過設定 log_rotation_age = 0 來修復這兩種情況,以便不會發生基於時間的輪換。此外,將 004_logrotate.pl 中設定 lc_messages = 'C' 的決定吸收進 kerberos 測試中,希望它能在非英語的常見語言環境中工作。報告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=pogona&dt=2020-12-24%2022%3A10%3A04 報告:https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=petalura&dt=2020-02-01%2022%3A20%3A04 https://git.postgresql.org/pg/commitdiff/5c31afc49d0b62b357218b6f8b01782509ef8acd

  • 真正修正 cipher.c 中的虛擬實作。945083b2f 不足以消除編譯器警告。 https://git.postgresql.org/pg/commitdiff/0848cf4f553bda5a9f044c56b3bec19929ee24e6

Alexander Korotkov 推送

Michaël Paquier 推送

  • 重構邏輯以檢查字串中是否僅包含 ASCII 字元。相同的邏輯存在於定序命令、SASLprep 和 pgcrypto 中,因此這刪除了一些程式碼。作者:Michael Paquier 審閱者:Stephen Frost, Heikki Linnakangas 討論:https://postgr.es/m/X9womIn6rne6Gud2@paquier.xyz https://git.postgresql.org/pg/commitdiff/93e8ff8701a65a70ea8826bdde7fdbbd9c285477

  • 修正 recovery_target_xid 解析的可移植性問題。此參數的解析一直在使用 strtoul(),這在各個平台上不具備可移植性。在大多數 Unix 平台上,unsigned long 的大小為 64 位,而在 Windows 上則為 32 位。在復原場景中,通常依靠 txid_current() 甚至更新的 pg_current_xact_id() 的輸出來取得事務 ID,以設定 recovery_target_xid。這些函式傳回的值包括計算結果中的 epoch,一旦 epoch 遞增,將導致 strtoul() 在 unsigned long 的大小為 32 位時失敗。WAL 記錄和 2PC 資料僅包含有關 32 位 XID 的資訊,並且不可能有跨越一個以上 epoch 的 XID,因此捨棄設定的事務 ID 的高位對復原沒有影響。相反,使用 strtoul() 會阻止跨平台的行為一致性,具體取決於 unsigned long 的大小。此提交變更 recovery_target_xid 的解析,改為使用 pg_strtouint64(),該函式在 9.6 版本中已可用。有一個 TAP 測試強調使用 recovery_target_xid 進行復原,其中添加了基於 pg_reset{xlog,wal} 的調整,以提升 XID epoch,以便測試此變更,這是根據 Alexander Lakhin 的想法。報告者:Alexander Lakhin 討論:https://postgr.es/m/16780-107fd0c0385b1035@postgresql.org 向後移植:9.6 https://git.postgresql.org/pg/commitdiff/6db27037b99358018353b8748719cfa9de484988

  • 修正文件和註解中的錯字和文法。這修正了文檔的幾個區域以及一些有關風格、文法甚至格式的註解。作者:Justin Pryzby 討論:https://postgr.es/m/20201222041153.GK30237@telsasoft.com https://git.postgresql.org/pg/commitdiff/90fbf7c57df601c7e0b43ae7cf71f0f69908a7cc

Tomáš Vondra 推送

Bruce Momjian 推送

Noah Misch 推送了

Jeff Davis 推送了

待處理的修補程式 (Pending Patches)

Kyotaro HORIGUCHI 發送了另一個修補程式版本,使統計資訊收集器 (stats collector) 使用共享記憶體而不是檔案來進行中間儲存。

Kyotaro HORIGUCHI 發送了另一個修補程式版本,以修復幾何資料類型的 NaN 處理。

Masahiko Sawada 發送了一個修補程式,以確保在建立擴充功能時建立的架構 (schema) 在刪除擴充功能時也會被刪除。

Justin Pryzby 發送了兩個修補程式版本,以將 zstd 壓縮新增到 pg_dump。

Peter Smith 發送了另外五個修補程式版本,以允許 table-sync worker 使用多個交易。

Bharath Rupireddy 和 Michaël Paquier 交換了修補程式,以便在關聯已經存在時,在 CTAS/CMV 中快速失敗。

Konstantin Knizhnik 和 Pavel Stěhule 交換了修補程式,以新增一個登入事件,可用於事件觸發器。

Bharath Rupireddy 送出了 CTAS 中使用平行插入的修補程式的另外四個修訂版本。

Zeng Wenjing 送出了實作全域暫存資料表的修補程式的另一個修訂版本。

Amit Langote 送出了另一個修補程式的修訂版本,以便在分割資料表中建立外鍵觸發器,並使用相同的方法在跨分割區更新期間正確強制執行外鍵。

Amit Langote 送出了另一個修補程式的修訂版本,以便延遲初始化結果關聯資訊。

Thomas Munro 送出了另一個修補程式的修訂版本,以提供同步的 scatter/gather I/O 常式,pg_preadv() 和 pg_pwritev(),它們對應於具有這些常式的系統上的 preadv() 和 pwritev(),並使用向量 I/O 將 WAL 區段歸零。

Peter Geoghegan 送出了一個用於檢測 heap_compute_xid_horizon_for_tuples() 的修補程式。

David Rowley 送出了另一個修補程式的修訂版本,以減少 Windows 上的 contrib 建置特殊情況。

Yugo Nagata 送出了另一個修補程式的修訂版本,以實作具體化檢視表的增量維護。

Michaël Paquier 和 Justin Pryzby 交換了修補程式,允許 CLUSTER、VACUUM FULL 和 REINDEX 在執行時更改 tablespace。

Masahiko Sawada 送出了一個修補程式,以新增一個新的 IndexAM API 來控制索引清理策略。

Fujii Masao 送出了另兩個修補程式的修訂版本,以修復 recovery_conflict_lock 死鎖。

Amit Kapila 和 Kirk Jamison 交換了修補程式,以使用 dlist 更有效地刪除關聯緩衝區。

Pavel Stěhule 送出了另兩個修補程式的修訂版本,以實作綱要變數。

Dmitry Dolgov 送出了另兩個修補程式的修訂版本,以便為 JSONB 使用新的下標基礎結構。

Michaël Paquier 送出了一個修補程式,以清除 makefiles 中的一些 -I$(libpq_srcdir)

Craig Ringer 送出了一個修補程式,以新增一個 $node->gdb_backends() 方法到 PostgresNode 實例。

Andrey V. Lepikhov 送出了另一個修補程式的修訂版本,以便在具有外部分割區的資料表的情況下加速 COPY FROM,方法是在 FDW API 中實作一些新方法:BeginForeignCopy、EndForeignCopy 和 ExecForeignCopy。

Justin Pryzby 送出了另一個修補程式的修訂版本,以使 pg_ls_*() 顯示目錄和共享檔案集。

Simon Riggs 送出了一個修補程式,以新增一個布林值 transaction_cleanup GUC,預設為關閉,旨在取代諸如連線池之類的事物中 DISCARD ALL 的使用。

Ajin Cherian 送出了另一個修補程式的修訂版本,以實作兩階段交易的邏輯解碼。

Fujii Masao 和 Bharath Rupireddy 交換了修補程式,旨在修復一個錯誤,該錯誤表現為 postgres_fdw 的連線洩漏,當關聯的使用者映射被刪除時,通過在 pgfdw_inval_callback() 中關閉無效連線(當它們不在交易中時),或在 pgfdw_xact_callback() 中(該回呼在每個動作結束時被呼叫,一旦註冊,在當前會話中)。

Li Japin 送出了一個修補程式,以更好地記錄流複製協定。

Thomas Munro 送出了另一個修補程式的修訂版本,以實作 WAL 的預先提取。

Bharath Rupireddy 送出了另一個修補程式的修訂版本,以新增用於多個和單個插入的新資料表 AM。

Kyotaro HORIGUCHI 送出了另一個修補程式的修訂版本,使其有可能在不重寫堆積的情況下更改資料表持久性,並新增一個新命令:ALTER TABLE ALL IN TABLESPACE SET LOGGED/UNLOGGED。

Kyotaro HORIGUCHI 送出了一個針對 pg_waldump 的修補程式,該修補程式限制了開始時顯示的行數。

Masahiro Ikeda 送出了另一個修補程式的修訂版本,以將 WAL 寫入/fsync 統計資訊新增到 pg_stat_wal 檢視表中。

Nikita Glukhov 送出了另一個修補程式的修訂版本,以新增 SQL/JSON 函數。

Nikita Glukhov 送出了另一個修補程式的修訂版本,以實作 JSON_TABLE。

Dilip Kumar 和 Andrey Borodin 交換了修補程式,以實作自訂資料表壓縮方法。

Dmitry Dolgov 送出了另一個修補程式的修訂版本,以防止 ArrayExpr 中每個元素的混亂。

Andrey Borodin 送出了另一個修補程式的修訂版本,以重組 pglz 壓縮程式碼,使其更有效率。這獲得了大約 1.4 倍的加速。

Julien Rouhaud 送出了另一個修補程式的修訂版本,以將一個布林欄位 toplevel 新增到 pg_stat_statements。

Fabien COELHO 送出了一個修補程式,以將資料表存取方法新增為 pgbench 的一個選項。

Justin Pryzby 送出了另一個修補程式的修訂版本,以新增一個針對核心資料類型二進位相容性的 pg_upgrade 測試。

Alexander Korotkov 送出了一個修補程式,以修復 multirange_bsearch_match() 比較函數中的錯誤,實作運算符以檢查範圍是否包含多範圍,透過新增 const 限定詞(如果適用)並使用範圍型別快取引數替換多範圍型別快取引數,從而改進內部多範圍函數的簽名,為多範圍新增 GiST 索引,並將多範圍匹配支援新增到現有的範圍 GiST 索引。

Justin Pryzby 送出了另一個修補程式的修訂版本,以修復最新的文件中的拼字錯誤並進行一些文字潤飾。