2025年9月25日: PostgreSQL 18 发布!

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 commit 中添加的“cd”命令在调用 psql 之前是有意义的(至少我是这么认为的)。但 4e3a61635 移除了解释何时使用它的支持性文本,使其变得令人困惑。因此将其删除。另外,将四点填充改为三点填充,以表示路径中未提供的部分,因为至少有一个人将四点填充视为 typo 而不是“../..”。并修复这些/那些不一致之处。讨论: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 的超时时间。Commit 7b28913bc 认为 30 秒足够长,但在 valgrind 运行等上下文中,不一定够。 https://git.postgresql.org/pg/commitdiff/08dde1b3dc78e90e01f3af8e89ab27ed37cd8963

  • 改进 autoprewarm 对早期关闭场景的处理。如果 DBA 在 autoprewarm 完成加载要预热的块列表之前发出“pg_ctl stop -m fast”,则会发生错误。当前的 worker 进程会成功提前终止,但(如果这不是最后一个要预热块的数据库)leader 进程只会尝试为下一个数据库启动另一个 worker。由于 postmaster 现在处于 PM_WAIT_BACKENDS 状态,它会忽略启动请求,而 leader 则一直等待直到被手动杀死。这主要是我们用于启动后台 worker 的不完善设计造成的,但对其进行适当修复可能会过于侵入性而无法回溯。为了改善这种情况,让 apw_load_buffers() 在尝试启动另一个 worker 之前检查是否收到了 SIGTERM 信号。这样,在每个 worker 启动过程中,只有在请求启动和 worker 成功启动之间存在一个非常狭窄的窗口可能发生 SIGTERM。另一个问题是,如果 leader 进程确实退出,它将无条件地用当前共享缓冲区中的块重写 autoprewarm.blocks,从而忘记了我们在预热时尚未处理的任何块。这似乎很不方便,因为下一次数据库启动将不会有预期的预热效果。修复使其在初始加载尝试完成之前关闭时,不修改文件。根据 John Thompson 的 bug #16784。回溯到引入 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-to-children 信号场景,尽管目前没有一个场景像 SIGQUIT 那样被严重过度使用。讨论:https://postgr.es/m/559291.1608587013@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7e784d1dc191be24480a6b31a4ddc8e0e52be24d

  • 修复关闭和未启动的后台 worker 之间的竞态条件。如果在一个进程决定请求一个新的后台 worker 和 postmaster 能够启动该 worker 之间发出了数据库关闭(智能或快速)命令,那么什么都不会发生,因为 postmaster 在退出 PM_RUN 状态后不会启动任何 bgworker。这没关系……除非请求进程正在等待该 worker 完成(甚至只是等待它启动);在这种情况下,请求者将卡住,并且只有手动干预才能使我们能够关闭。为了修复,在 postmaster 发送关闭(SIGTERM)信号时取消待处理的 worker 请求,并在之后收到的任何新请求点取消。 (我们可以通过仅对有等待者的 worker 进行取消来稍微优化一下。)为了符合现有的 bgworker API,将“取消”处理为 worker 已启动并立即停止,从而取消 bgworker 条目的注册。等待进程无论如何都需要处理过早的 worker 退出,所以这不应该引入比之前更糟糕的 bug。我们确实有一个副作用,即可重启 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 中的 dummy 实现。945083b2f 不足以消除编译器警告。 https://git.postgresql.org/pg/commitdiff/0848cf4f553bda5a9f044c56b3bec19929ee24e6

Alexander Korotkov 提交了

Michaël Paquier 提交

Tomáš Vondra 提交了

Bruce Momjian 已推送

Noah Misch 推送

Jeff Davis 推送

待处理补丁

Kyotaro HORIGUCHI 提交了统计信息收集器使用共享内存而不是文件进行中间存储的补丁的另一个版本。

Kyotaro HORIGUCHI 提交了修复几何数据类型 NaN 处理的补丁的另一个版本。

Masahiko Sawada 提交了一个补丁,以确保在创建扩展时创建的模式在扩展被删除时也被删除。

Justin Pryzby 提交了两个补丁版本,用于向 pg_dump 添加 zstd 压缩。

Peter Smith 提交了五个补丁版本,允许表同步 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 提交了一个用于 instrument heap_compute_xid_horizon_for_tuples() 的补丁。

David Rowley 提交了另一个补丁版本,以减少 Windows 上 contrib 的构建特殊情况。

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

Michaël Paquier 和 Justin Pryzby 交换了补丁,允许 CLUSTER、VACUUM FULL 和 REINDEX 动态更改表空间。

Masahiko Sawada 提交了一个补丁,用于添加一个新的 IndexAM API 来控制索引 vacuum 策略。

Fujii Masao 提交了两个补丁版本,用于修复 recovery_conflict_lock 死锁。

Amit Kapila 和 Kirk Jamison 交换了补丁,使用 dlist 更高效地删除 relation buffers。

Pavel Stěhule 发送了两个额外版本的补丁,用于实现模式变量。

Dmitry Dolgov 提交了两个补丁版本,用于 JSONB 的新下标基础设施。

Michaël Paquier 提交了一个补丁,用于清理 makefiles 中的一些 -I$(libpq_srcdir)

Craig Ringer 提交了一个补丁,为 PostgresNode 实例添加了一个 $node->gdb_backends() 方法。

Andrey V. Lepikhov 提交了另一个补丁版本,通过在 FDW API 中实现一些新方法:BeginForeignCopy、EndForeignCopy 和 ExecForeignCopy,来加速带有外国分区的表的 COPY FROM。

Justin Pryzby 提交了另一个补丁版本,用于让 pg_ls_*() 显示目录和共享文件集。

Simon Riggs 提交了一个补丁,添加了一个布尔值 GUC transaction_cleanup,默认为 off,它旨在替换连接池等中的 DISCARD ALL 用法。

Ajin Cherian 提交了另一个补丁版本,用于实现两阶段事务的逻辑解码。

Fujii Masao 和 Bharath Rupireddy 交换了补丁,旨在修复一个 bug,该 bug 表现为 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 提交了另一个补丁版本,用于向 pg_stat_wal 视图添加 WAL 写入/fsync 统计信息。

Nikita Glukhov 提交了另一个补丁版本,用于添加 SQL/JSON 函数。

Nikita Glukhov 提交了另一个补丁版本,用于实现 JSON_TABLE。

Dilip Kumar 和 Andrey Borodin 交换了补丁,用于实现自定义表压缩方法。

Dmitry Dolgov 提交了另一个补丁版本,用于防止 ArrayExpr 中所有元素的乱序。

Andrey Borodin 提交了另一个补丁版本,用于重新组织 pglz 压缩代码以提高效率。这获得了约 1.4 倍的速度提升。

Julien Rouhaud 提交了另一个补丁版本,用于向 pg_stat_statements 添加一个布尔列 toplevel。

Fabien COELHO 提交了一个补丁,将表访问方法作为选项添加到 pgbench。

Justin Pryzby 提交了另一个补丁版本,用于添加一个 pg_upgrade 测试,以检查核心数据类型的二进制兼容性。

Alexander Korotkov 提交了一个补丁,用于修复 multirange_bsearch_match() 的比较函数中的 bug,实现检查范围是否包含 multirange 的运算符,通过添加 const 限定词(如果适用)并用 range typecache 参数替换 multirange typecache 参数来改进内部 multirange 函数的签名,为 multiranges 添加 GiST 索引,并为现有的 range GiST 索引添加对 multirange 匹配的支持。

Justin Pryzby 提交了另一个补丁版本,用于修复最新文档中的拼写错误和进行一些文字润色。