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 文件的描述。在调用 psql 之前单独的“cd”命令是有意义的(或者至少我认为如此),当它在 commit ed1939332 中添加时。但是 4e3a61635 删除了解释何时使用它的支持文本,使其令人困惑。所以删除它。还将路径的未提供部分从四个点填充符切换到三个点填充符,因为至少有一个人将四个点填充符理解为“../..”的拼写错误。并修复这些/那些不一致之处。讨论: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 对早期关闭场景的处理。如果在 autoprewarm 完成加载要预热的块列表之前,DBA 发出“pg_ctl stop -m fast”,则会发生不好的事情。当前的工作进程成功地提前终止,但是(如果这不是最后一个有块要预热的数据库),主导进程将尝试为下一个数据库启动另一个工作进程。由于 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,如果有人尝试这样做的话)。为此,请在 postmaster 设置的 pmsignal.c 的共享内存数据结构中添加一个字段,该字段在向其子进程广播 SIGQUIT 之前设置。似乎不需要互锁;中间的信号发送和信号接收应充分序列化对该字段的访问。因此,这并不比 pmsignal.c 的现有用法风险更大。将来我们可能会扩展这个想法,以改善其他主进程到子进程的信号场景,尽管目前似乎没有像 SIGQUIT 那样严重过载的信号场景。讨论:https://postgr.es/m/559291.1608587013@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7e784d1dc191be24480a6b31a4ddc8e0e52be24d

  • 修复关闭和未启动的后台工作进程之间的竞争条件。如果在某个进程决定请求新的后台工作进程的时间与 postmaster 可以启动该工作进程的时间之间命令了数据库关闭(智能或快速),则什么都不会发生,因为 postmaster 一旦退出 PM_RUN 状态,就不会启动任何 bgworkers。这很好...除非请求进程正在等待该工作进程完成(甚至启动);在这种情况下,请求者将被卡住,并且只有手动干预才能使我们能够关闭。为了修复此问题,请在 postmaster 发送关闭 (SIGTERM) 信号时取消对工作进程的挂起请求,并类似地取消此后到达的任何新请求。(我们可以稍微优化一下,仅针对有等待者的工作进程执行取消操作。)为了适应现有的 bgworker API,“取消”看起来像工作进程已启动并立即停止,从而导致取消注册 bgworker 条目。等待进程无论如何都必须处理工作进程的过早退出,因此这应该不会引入以前不存在的错误。我们确实有一个副作用,即当理论上可重启的 bgworkers 的注册记录本应保留在原位时,它们可能会消失;但是由于我们正在关闭,因此这无关紧要。反向移植到 v10。将此功能放入 9.6 中也可能很有价值,但是那里对 bgworkers 的管理略有不同(尤其是请参见 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 已获取类似的代码,该代码显然具有相关的故障模式。除了是全新的之外,很少有构建农场的动物运行该测试,因此我们尚未在那里看到故障也就不足为奇了。通过设置 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 推送

待处理的补丁

Kyotaro HORIGUCHI 发送了另一个修订的补丁,使统计收集器使用共享内存而不是文件进行中间存储。

Kyotaro HORIGUCHI 发送了另一个修订的补丁,以修复几何数据类型的 NaN 处理。

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

Justin Pryzby 发送了两个修订的补丁,以向 pg_dump 添加 zstd 压缩。

Peter Smith 发送了五个修订的补丁,允许表同步工作器使用多个事务。

Bharath Rupireddy 和 Michaël Paquier 交换了补丁,以便在关系已存在的情况下,在 CTAS/CMV 中快速失败。

Konstantin Knizhnik 和 Pavel Stěhule 交换了补丁,以添加一个可以在事件触发器中使用的登录事件。

Bharath Rupireddy 发送了另外四个修订的补丁,以在 CTAS 中使用并行插入。

Zeng Wenjing 发送了另一个修订的补丁,以实现全局临时表。

Amit Langote 发送了另一个修订的补丁,以在分区表中也创建外键触发器,并使用相同的触发器在跨分区更新期间正确强制执行外键。

Amit Langote 发送了另一个修订的补丁,以延迟初始化结果关系信息。

Thomas Munro 发送了另一个修订的补丁,以提供同步分散/收集 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 动态更改表空间。

Masahiko Sawada 发送了一个补丁,以添加一个新的 IndexAM API 来控制索引清理策略。

Fujii Masao 发送了另外两个修订的补丁,以修复 recovery_conflict_lock 死锁。

Amit Kapila 和 Kirk Jamison 交换了补丁,以使用 dlist 更有效地删除关系缓冲区。

Pavel Stěhule 发送了另外两个修订的补丁,以实现模式变量。

Dmitry Dolgov 发送了另外两个修订的补丁,以将新的下标基础设施用于 JSONB。

Michaël Paquier 发送了一个补丁,以清理 makefile 中的一些 -I$(libpq_srcdir)

Craig Ringer 发送了一个补丁,以向 PostgresNode 实例添加一个 $node->gdb_backends() 方法。

Andrey V. Lepikhov 发送了另一个修订的补丁,以通过在 FDW API 中实现一些新方法来加速外部分区表的 COPY FROM:BeginForeignCopy、EndForeignCopy 和 ExecForeignCopy。

Justin Pryzby 发送了另一个修订的补丁,使 pg_ls_*() 显示目录和共享文件集。

Simon Riggs 发送了一个补丁,以添加一个布尔事务清理 GUC,默认为关闭,旨在替换连接池器等事物中 DISCARD ALL 的用法。

Ajin Cherian 发送了另一个修订的补丁,以实现两阶段事务的逻辑解码。

Fujii Masao 和 Bharath Rupireddy 交换了补丁,旨在修复一个错误,该错误表现为当关联的用户映射在当前会话中被 pgfdw_inval_callback() 中关闭无效连接(当它们不在事务中时)或在每个操作结束后调用的 pgfdw_xact_callback() 中删除时,postgres_fdw 造成的连接泄漏。

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 发送了另一个修订的补丁,以向 pg_stat_statements 添加一个布尔列 toplevel。

Fabien COELHO 发送了一个补丁,以添加表访问方法作为 pgbench 的选项。

Justin Pryzby 发送了另一个修订的补丁,以添加一个用于核心数据类型二进制兼容性的 pg_upgrade 测试。

Alexander Korotkov 发送了一个补丁,以修复 multirange_bsearch_match() 的比较函数中的错误,实现用于检查范围是否包含多范围的运算符,通过添加 const 限定符(在适用时)并将多范围类型缓存参数替换为范围类型缓存参数,来改进内部多范围函数的签名,为多范围添加 GiST 索引,并为现有范围 GiST 索引添加对多范围匹配的支持。

Justin Pryzby 发送了另一个修订的补丁,以修复最新文档中的错别字并进行一些文字润色。