PostgreSQL 每周新闻 - 2021 年 5 月 23 日

由 PWN 于 2021-05-24 发布
PWN

PostgreSQL 每周新闻 - 2021 年 5 月 23 日

PostgreSQL 14 Beta 1 发布。 测试!

官方 IRC 频道已从 Freenode 迁移到 Libera。详情请点击 此处

PostgreSQL 产品新闻

DBD::Pg 3.15.0,一个用于 PostgreSQL 的 Perl 驱动程序,已发布

pg_back 2.0.1,是一个可以将 PostgreSQL 数据库转储到文件的工具,已发布

五月份的 PostgreSQL 工作

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

PostgreSQL 新闻

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

本周的 PostgreSQL 每周新闻由 David Fetter 带给您

请在太平洋标准时间下午 3:00 前(星期日)将新闻和公告发送至 david@fetter.org。

已应用的补丁

Bruce Momjian 推送了

Etsuro Fujita 推送了

Magnus Hagander 推送了

Peter Eisentraut 推送了

Tom Lane 推送了

  • 标记 14beta1。 https://git.postgresql.org/pg/commitdiff/e4f9737fac77a5cb03a84d1f4038d300ffd28afd

  • 避免在不需要的地方创建 testtablespace 目录。最近,我们重构了代码,以便 pg_regress 创建核心回归测试使用的“testtablespace”子目录,而不是在 makefile 中执行此操作。这会产生不希望的副作用,即在每个包含“input”或“output”测试文件的目录中创建这样的子目录。由于这些子目录保持为空,因此 git 不会抱怨它们,但它们仍然很杂乱。为了修复此问题,发明了一个明确的 --make-testtablespace-dir 开关,以便 pg_regress 仅在被明确告知时才创建子目录。讨论: https://postgr.es/m/2854388.1621284789@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/413c1ef98e0c9c708c4a9a13a838a55b65b16a80

  • 清理 cpluspluscheck 违规。“typename”是 C++ 关键字,因此 pg_upgrade.h 无法在 C++ 中编译。幸运的是,似乎没有理由有人需要这样做。尽管如此,项目策略是所有 .h 文件都应该通过 cpluspluscheck,因此重命名该参数以修复此问题。57c081de0 中的疏忽;作为回溯补丁。(要求 pg_upgrade.h 通过 cpluspluscheck 的策略仅追溯到 v12,但最好使此代码在所有分支中看起来都相同。) https://git.postgresql.org/pg/commitdiff/6d59a218c38adf5b993200a804713df4982a0c75

  • 避免在 plpgsql FOR 循环内的 COMMIT 后出现解压缩失败。exec_for_query() 通常会尝试一次从正在迭代的查询中预取几行,以减少执行程序入口/出口开销。不幸的是,如果我们在循环内有 COMMIT 或 ROLLBACK,这是不安全的,因为在我们预取但尚未检查的数据中可能存在 TOAST 引用。在 COMMIT/ROLLBACK 之后,我们的会话中没有快照,这意味着 VACUUM 可以自由删除最近删除的 TOAST 行。这最初被报告为触发 init_toast_snapshot() 中“没有已知快照”错误的案例,但即使您错过了这种情况,也可能会出现“丢失 toast 块”,如添加的隔离测试用例所示。为了修复此问题,只需在非原子上下文中禁用预取。也许会有性能方面的抱怨,促使我们稍后更加努力,但目前尚不清楚这是否真的花费很多,我怀疑我们是否希望回溯任何复杂的修复。顺便说一句,调整 init_toast_snapshot() 中的错误消息,使其更清楚地说明问题的可能原因。我基于 Konstantin Knizhnik 的早期调查编写的补丁。根据 Andreas Wicht 的错误 #15990。回溯到添加了过程内 COMMIT 的 v11。讨论: https://postgr.es/m/15990-eee2ac466b11293d@postgresql.org https://git.postgresql.org/pg/commitdiff/f21fadafaf0fb5ea4c9622d915972651273d62ce

  • 在执行 COMMIT/ROLLBACK 操作后,恢复门户级别的快照。COMMIT/ROLLBACK 操作必然会销毁会话中的所有快照。最初的程序内事务实现只是草率地执行了此操作,忽略了这会导致我们在与正常情况下不同的环境中执行的事实。特别是,事实证明,对 toasted datums 的处理非常依赖于外部的 ActiveSnapshot:否则,当 SPI 或核心执行器弹出它们使用的任何快照并返回时,取消引用查询结果中可能出现的任何 toasted datums 是不安全的。 可以证明由于这种疏忽而导致的 “no known snapshots” 和 “missing chunk number N for toast value” 错误。历史上,这个外部快照一直由 Portal 代码持有,这似乎是一个保持原状的好计划。因此,在 pquery.c 中添加基础设施,以便在门户拥有的快照不存在时重新建立它,并添加足够的簿记支持,以便我们可以判断它是否存在。然而,我们不能仅仅在 COMMIT/ROLLBACK 中重新建立门户快照。与正常的事务开始一样,获取第一个快照应该等到 SET 和 LOCK 命令之后。因此,教导 spi.c 在正确的时间执行此操作。(请注意,此补丁不解决任何尝试在不使用 SPI 执行 SQL 命令的情况下运行程序内事务的 PL 的问题。)这使得 SPI 的 no_snapshots 参数相当不贴切,因此在 HEAD 中,将其重命名为 allow_nonatomic。replication/logical/worker.c 也需要进行一些修复,因为它在执行 AFTER 触发器时没有小心地保持快照打开。该代码没有使用门户,我怀疑有一天我们必须修复它。但目前,只需重新排列操作顺序。这包括向后移植最近添加的 finish_estate(),以集中化清理逻辑。此操作还向 v13 中向后移植了 commit 2ecfeda3e,以改进 worker.c 的测试覆盖率(正是该测试暴露了 worker.c 的快照管理是错误的)。根据 Andreas Wicht 的 bug #15990。向后移植到添加了程序内 COMMIT 的 v11。讨论:https://postgr.es/m/15990-eee2ac466b11293d@postgresql.org https://git.postgresql.org/pg/commitdiff/84f5c2908dad81e8622b0406beea580e40bb03ac

  • 修复 GENERATED 表达式中 “tableoid” 的用法。我们认为这是受支持的(尽管我怀疑这不是一个好主意,因为 tableoid 不是不可变的)。但是,有几个代码路径未能及时填充该字段,导致这样的 GENERATED 表达式看到零或错误的值。当 ALTER TABLE 向具有现有行的表添加新的 GENERATED 列时,以及在具有 GENERATED 列的外部表上进行常规 INSERT 或 UPDATE 时,会发生这种情况。在调查 Vitaly Ustinov 的报告期间注意到。向后移植到引入 GENERATED 的 v12。讨论:https://postgr.es/m/CAM_DEiWR2DPT6U4xb-Ehigozzd3n3G37ZB1+867zbsEVtYoJww@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2b0ee126bbf01cbfd657bd53c94f9284ba903ca2

  • 禁止在 GENERATED 表达式中使用整行变量。以前允许这样做,但我认为这只是一个疏忽。这明显违反了生成列不能依赖于自身或其他生成列的规则。此外,由于代码依赖于不存在此类交叉引用的假设,因此很容易崩溃 ALTER TABLE,甚至在其他地方也是如此。即使您设法没有崩溃,您也会得到相当不稳定的、依赖于实现的结果。根据 Vitaly Ustinov 的报告。向后移植到引入 GENERATED 的 v12。讨论:https://postgr.es/m/CAM_DEiWR2DPT6U4xb-Ehigozzd3n3G37ZB1+867zbsEVtYoJww@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4b10074453d182b5fc11a5667bab2ef8532ff3a6

  • 删除 plpgsql 用于 SET/RESET 的特殊代码路径。在 84f5c2908 之后,plpgsql 不再需要专门处理 SET/RESET。这样做的目的是避免过早获取新的事务快照,而现在通过 _SPI_execute_plan() 的常规代码路径可以很好地做到这一点(实际上更好,因为它现在对 LOCK 也做了正确的事情)。因此,删除几行代码,回到将 SET/RESET 作为通用 SQL 命令的旧方法。这实质上恢复了 b981275b6 中的所有内容,除了测试用例外。讨论:https://postgr.es/m/15990-eee2ac466b11293d@postgresql.org https://git.postgresql.org/pg/commitdiff/30168be8f75b95183abccf48f0da7a64a0cfbd9f

  • 修复逻辑复制工作器中对不再打开的 relcache 条目的访问。如果我们将复制的元组操作重定向到分区子表,然后尝试为该事件触发 AFTER 触发器,则子表的关联缓存条目已关闭。只要该条目仍然存在且仍然有效,就不会有明显的负面影响,但是运气不佳的缓存刷新可能会导致崩溃或其他错误行为。为了修复此问题,请将 ExecCleanupTupleRouting 调用(即关闭子表的操作)延迟到触发触发器之后。这需要一些重构,以便清理函数可以访问必要的状态。在 HEAD 中,我利用了新的 ApplyExecutionData 结构,简化了 worker.c 的一些函数 API。但是,向后移植这方面的内容似乎不安全/不切实际,至少在不大量分析可能与 a04daa97a 的交互的情况下。顺便说一句,在 afterTriggerInvokeEvents 中添加一个 Assert,以捕获此类情况。这似乎是值得的,因为我们已经开发出许多相当非结构化的调用 AfterTriggerEndQuery 的方法。向后移植到 v13,其中 worker.c 具备了处理分区目标表的能力。讨论:https://postgr.es/m/3382681.1621381328@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/b39630fd41f25b414d0ea9b30804f4105f2a0aff

  • 当 postmaster 意外退出时,提供更详细的信息。当 postmaster 由于启动过程失败而停止时,发出 LOG 消息。如果我们由于该原因在 PM_STARTUP 阶段退出,则已经有类似的消息,因此如果启动过程在稍后失败而没有任何消息,似乎不一致。当 postmaster 由于崩溃后禁用 restart_after_crash 而停止时,也发出 LOG 消息。如果 DBA(或开发人员)忘记了已设置该消息,这似乎可能会有所帮助。此外,这也是 postmaster 在没有任何评论的情况下异常退出的唯一剩余位置。顺便说一句,删除一个无法访问的 ExitPostmaster(0) 调用。讨论:https://postgr.es/m/194914.1621641288@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/bc2a389efb3b52d259cefd53c16cfa00742116f2

  • 重新排列 pg_attribute 列以消除一些填充空间。现在 attcompression 只是一个 char,之后有很多浪费的填充空间。将其移动到 char 宽列组中,以每个 pg_attribute 条目节省 4 个字节的网络。同时,交换 attstorage 和 attalign 的顺序,以使这些列的组合更符合逻辑。此外,重新排序相关代码中的操作,以匹配新的字段顺序。此补丁还修复了一个直接的错误:equalTupleDescs() 未能比较 attcompression。例如,这可能会导致 relcache 重新加载在更改后无法采用新值。Michael Paquier 和 Tom Lane,根据 Andres Freund 的抱怨。讨论:https://postgr.es/m/20210517204803.iyk5wwvwgtjcmc5w@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/f5024d8d7b04de2f5f4742ab433cc38160354861

David Rowley 推送

  • 修复 README.barrier 中的错别字和过时的信息。当添加原子操作时,README.barrier 似乎没有收到备忘录。修复该问题。作者:Tatsuo Ishii,David Rowley 讨论:https://postgr.es/m/20210516.211133.2159010194908437625.t-ishii%40sraoss.co.jp 向后移植到:9.6,最旧的受支持版本 https://git.postgresql.org/pg/commitdiff/2ded19fa3a4dafbae80245710fa371d5163bdad4

  • 修复规划器在使用唯一连接的 Result Cache 时的问题。当规划器考虑使用 Result Cache 节点缓存嵌套循环连接内侧的结果时,它未能考虑到内部路径的参数化可能不是整个连接条件。如果连接被标记为 inner_unique,则我们可能会意外地将缓存置于单行模式。这意味着在缓存第一行后,条目将被标记为已完成。这是错误的,因为如果仅参数化了连接条件的一部分,则无法保证 Result Cache 级别的唯一连接的唯一性。只有在嵌套循环应用连接筛选器后,才能保证唯一性。如果找到后续行,则会导致:错误:缓存条目已完成。可以通过仅在参数化整个连接条件时将缓存置于单行模式来解决此问题。但是,当连接是唯一的时,嵌套循环只会读取其内侧,直到第一行匹配为止,因此这可能意味着我们永远没有机会将缓存条目标记为已完成。由于未完成的缓存条目对于后续查找毫无用处,因此在这种情况下,我们根本不考虑 Result Cache 路径。顺便说一句,删除声称上述错误更适合作为 Assert 的 XXX 注释。在出现触发它的实际案例之后,似乎最好将其保留为 ERROR。报告者:David Christensen 讨论:https://postgr.es/m/CAOxo6X+dy-V58iEPFgst8ahPKEU+38NZzUuc+a7wDBZd4TrHMQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9e215378d7fbb7d4615be917917c52f246cc6c61

Michaël Paquier 推送

藤井正雄推送

  • 修复 pg_stat_wal 中的问题。1)之前为了将 WAL 活动发送到统计收集器,同时存在 pgstat_send_wal() 和 pgstat_report_wal()。前者被 WAL 写入器使用,后者被大多数其他进程使用。它们有点多余,因此这个提交将它们合并到 pgstat_send_wal() 中以简化代码。2)之前,WAL 全局统计计数器被计算出来,然后与零填充的缓冲区进行比较,以确定自上次提交以来是否发生了任何 WAL 活动。这些计算和比较并不便宜。即使在只读工作负载中,也会经常执行此操作。此提交通过直接检查某些 WAL 活动计数器来确定是否有 WAL 活动统计信息要发送,从而修复了此问题。3)之前,pgstat_report_stat() 没有检查是否有 WAL 活动统计信息要发送,作为顶部的“如果没有事要做,则不进行时钟检查”检查的一部分。在没有传递其他条件的情况下,拥有挂起的 WAL 统计信息可能很少见,但是为了安全起见,此提交更改了 pgstat_report_stats(),使其在顶部也检查一些 WAL 活动计数器。此提交还添加了有关 WAL 统计信息设计的注释。报告人:Andres Freund 作者:Masahiro Ikeda 审阅人:Kyotaro Horiguchi,Atsushi Torikoshi,Andres Freund,Fujii Masao 讨论:https://postgr.es/m/20210324232224.vrfiij2rxxwqqjjb@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/d8735b8b4651f5ed50afc472e236a8e6120f07f2

  • 使备库提升将恢复暂停状态重置为“未暂停”。如果在恢复暂停时触发了提升,则暂停状态结束,提升继续。但是,以前在这种情况下,当提升正在进行时,pg_get_wal_replay_pause_state() 错误地返回“paused”。此提交更改了备库提升,使其在触发时将恢复暂停状态标记为“未暂停”,以解决此问题。作者:Fujii Masao 审阅人:Dilip Kumar,Kyotaro Horiguchi 讨论:https://postgr.es/m/f706876c-4894-0ba5-6f4d-79803eeea21b@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/167bd4804995afd654bd97ca9486acbece24377e

Amit Kapila 推送

  • 修复 020_messages.pl 测试。在创建订阅后,我们没有等待发布者赶上订阅者。现在,可能会发生以下情况:即使我们在测试中禁用了订阅,应用工作进程也会开始复制。这将使测试期望没有活动的槽位,但实际上存在一个。通过允许发布者等待赶上订阅来修复此症状。通过检查 walsender 是否存在来确保槽位仍然处于活动状态不是一个好主意,因为我们在清理 walsender 相关内存后会释放该槽位。通过检查 pg_replication_slots 中的槽位状态来修复它。此外,最好避免重复启用/禁用订阅。最后,我们关闭此测试的自动清理,以避免在消耗更改时测试中出现任何空事务。报告人:根据 buildfarm 作者:Vignesh C 审阅人:Amit Kapila,Michael Paquier 讨论:https://postgr.es/m/CAA4eK1+uW1UGDHDz-HWMHMen76mKP7NJebOTZN4uwbyMjaYVww@mail.gmail.com https://git.postgresql.org/pg/commitdiff/0a442a408b40d2c6710de7e5397cb2e769d8c630

  • 修复多个复制的同一表截断的死锁。在应用截断更改时,逻辑应用工作进程在被截断的关系上获取 RowExclusiveLock。这允许两个应用工作进程一次截断关系,从而导致死锁。原因是其中一个工作进程在更新 pg_class 元组后尝试在关系上获取 SHARE 锁,并开始等待在关系上获取了 RowExclusiveLock 的第二个工作进程。当第二个工作进程尝试更新 pg_class 元组时,它开始等待第一个工作进程,从而导致死锁。通过在应用截断更改之前,像普通截断操作一样,在关系上获取 AccessExclusiveLock 来修复此问题。作者:Peter Smith,测试用例由 Haiying Tang 提供 审阅人:Dilip Kumar,Amit Kapila 向后移植:11 讨论:https://postgr.es/m/CAHut+PsNm43p0jM+idTvWwiGZPcP0hGrHMPK9TOAkc+a4UpUqw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6d0eb38557155855539cd007f04736dc3b2ba16f

Dean Rasheed 推送

Andrew Dunstan 推送

待处理补丁

Yugo Nagata 发送了另一个用于实现增量物化视图的补丁的修订版。

Amul Sul 发送了另一个补丁的修订版,用于将 WAL 写入代码与 StartupXLOG() 分开,使用全局屏障实现 WAL 禁止状态,在 WAL 写入的 START_CRIT_SECTION 之前出现错误或断言,并记录所有这些。这是(除其他外)ALTER SYSTEM READ {ONLY | WRITE} 的基础结构。

Pavel Stěhule 发送了另一个补丁的修订版,用于实现模式变量。

Bharath Rupireddy 发送了另一个补丁的修订版,以避免在 slot_store_error_callback 和 conversion_error_callback 中访问目录。

Amit Langote 发送了一个补丁,用于重新措辞 pathnodes.h 中的一些注释以使其更清晰。

Ranier Vilela 发送了另一个补丁的修订版,以修复 zic 中可能的内存损坏。

Bharath Rupireddy 发送了三个补丁的修订版,以针对 PostgreSQL FDW 中的非数字值收紧 batch_size 和 fetch_size 选项。

Masahiro Ikeda 发送了另外两个补丁的修订版,以在不引入新变量的情况下提高报告 WAL 统计信息的性能。

Hou Zhijie 和 Amit Langote 交换了补丁,以在存在常量分区键时跳过分区元组路由。

Peter Smith 和 Ajin Cherian 交换了补丁,以将对预备事务的支持添加到内置逻辑复制中,为流式传输事务添加准备 API 支持,并跳过逻辑复制的空事务。

Amit Langote 发送了另外四个补丁的修订版,以 pgoutput 来修复 RelationSyncEntry.map 的内存管理,方法是在其所属的同步条目无效时释放创建元组转换映射及其组件 TupleDesc 时分配的内存,并在认为不需要任何映射时释放 TupleDesc。

Nitin Jadhav 发送了另外两个补丁的修订版,以从 create_list_bounds() 中删除额外的 malloc,将 PartitionListValue 分配为单个块,在 PartitionHashBound 的 create_hash_bounds 中执行相同的操作,批量分配数据数组以避免 palloc 开销,并在 create_range_bounds() 中 pfree 中间结果。

Bertrand Drouvot 发送了另一个补丁的修订版,以在 pgupgrade 中保留 oldestxid。

Andrew Dunstan 发送了另一个补丁的修订版,以实现 SQL/JSON 函数。

Andrew Dunstan 发送了另一个补丁的修订版,以实现 SQL/JSON JSON_TABLE。

Matthias van de Meent 发送了另一个补丁的修订版,以改进 heapam 中行指针数组截断的使用。

Heikki Linnakangas 发送了一个补丁,以允许多次指定 pg_waldump --rmgr 选项。

Robert Haas、Dilip Kumar 和 Kyotaro HORIGUCHI 交换了补丁,旨在修复一个表现为恢复中竞争条件的错误。

Takashi Menjo 发送了另一个补丁的修订版,以将 PMEM 上的 WAL 段文件映射为 WAL 缓冲区。

Justin Pryzby 发送了另一个补丁的修订版,以实现 FPI 的不同压缩方法。

Takamichi Osumi 发送了一个补丁,以禁止在 user_catalog_table 上执行 TRUNCATE。

Peter Eisentraut 和 Álvaro Herrera 交换了补丁,以向 pgxs 添加 NO_INSTALL 选项。

Bharath Rupireddy 发送了另外三个补丁的修订版,以消除使用“非负数”的错误消息的歧义。

Daniel Gustafsson 发送了两个补丁的修订版,以扩展 configure_test_server_for_ssl 以添加扩展,并为 sslinfo 添加测试。

Mathis Rudolf 发送了一个补丁,旨在通过在 'refresh_by_match_merge()' 中添加 _pg_internal_ 前缀到诸如 'mv' 和 'newdata' 之类的别名来修复一个表现为 REFRESH MATERIALIZED VIEW CONCURRENTLY 中的别名冲突的错误,这使得它不太可能导致与用户创建的 MV 的任何冲突。

Yura Sokolov 发送了一个补丁,向 exec_execute_message() 添加了一个 PortalDrop 调用。

Bharath Rupireddy 和 Peter Smith 交换了补丁,以重构 parse_subscription_options 中的“互斥选项”错误报告代码。

Michaël Paquier 发送了另一个补丁的修订版,以切换 pg_upgrade 的测试以使用 TAP。

Greg Nancarrow 发送了另一个补丁的修订版,以修复并行工作进程失败的断言和核心转储。

Kirill Reshke 发送了一个补丁,旨在通过在 KnownAssignedXids 中使用双向链表来修复表现为备用快照缓慢的错误。

Paul Guo 发送了一个补丁,通过使其可写来修复由于只读文件 open() 错误导致的 pg_rewind 失败。

Alexander Pyhalov 发送了一个补丁,使其可以将带有函数 RTE 的连接推送到 PostgreSQL 数据源。

Nitin Jadhav 发送了另一个补丁的修订版,以支持 tzh tzm 模式。

Michaël Paquier 发送了一个补丁,强制禁用服务器中的 SSL 重新协商。

Ivan Panchenko 发送了另一个补丁的修订版,使其可以在登录时触发操作。

Takayuki Tsunakawa 发送了另一个补丁的修订版,以在重写器中传播 CTE 属性标志。

Ashutosh Bapat 发送了两个补丁修订版,用于在 LogicalIncreaseXminForSlot() 中报告新的 catalog_xmin 候选值。

Michaël Paquier 发送了另一个补丁修订版,用于向 pg_stat_activity 添加认证数据。

Bharath Rupireddy 发送了另一个补丁修订版,用于为并行 vacuum 重写错误消息和文档。

侯志杰发送了两个补丁修订版,旨在修复当 batch_size > 65535 时,FDW 批量插入失败的错误。

Dmitry Dolgov 发送了另一个补丁修订版,用于实现索引跳跃扫描。

Tomáš Vondra 发送了一个补丁,旨在修复 REFRESH MATERIALIZED VIEW 性能下降的错误。

Michaël Paquier 和 Tom Lane 交换了补丁,以减少 pg_attribute 结构体的内存占用。

David Rowley 发送了另一个补丁修订版,用于加速使用 Consts 集合的 NOT IN() 操作。

Vigneshwaran C 发送了另一个补丁修订版,用于在 PUBLICATION 和 SUBSCRIPTION 命令中添加对缺失选项的 Tab 补全功能。