E.4. 发布版本 11.19 #
发布日期:. 2023-02-09
本次发布包含来自 11.18 的多项修复。有关 11 主版本新特性的说明,请参见第 E.23 节。
PostgreSQL 社区将于 2023 年 11 月停止发布 11.X 系列的更新。建议用户尽快升级到较新的发布分支。
E.4.2. 变更
允许在尚未(完全)有效的索引上设置
REPLICA IDENTITY(Tom Lane)当 pg_dump 导出一个标记了
REPLICA IDENTITY的分区索引时,它生成的命令序列会在分区索引被标记为有效之前应用REPLICA IDENTITY,导致恢复失败。似乎没有很好的理由禁止按此顺序操作,因此允许这样做。在索引变为有效之前,该标记不会产生任何效果。修复在规则中从多行
VALUES列表执行INSERT时对DEFAULT标记的处理(Dean Rasheed)在某些情况下,
DEFAULT标记不会被替换为正确的默认值表达式,导致“unrecognized node type”错误。修复并行哈希连接在边界情况下发生的数据损坏(Dmitry Astapov)
如果正在写入临时文件的大元组的最后一个块恰好是 32760 字节,由于栅栏柱错误会导致数据损坏。查询通常会在稍后以数据损坏的症状而失败。
遵循
checkpoint_completion_target的非默认设置(Bharath Rupireddy)在
checkpoint_completion_target更改后,内部状态未被更新,可能导致检查点 I/O 执行得比预期更快或更慢,特别是在动态更改该设置时。在
recovery_target_xid模式下记录正确的结束时间戳(Tom Lane)当基于
recovery_target_xid设置且recovery_target_inclusive=off结束恢复时,我们在“recovery stopping before ... transaction”日志消息中打印了一个不正确的时间戳(始终为 2000-01-01)。在扩展查询协议中,如果我们正在运行管道,避免在
ANALYZE之后立即提交(Tom Lane)如果没有显式的
BEGIN TRANSACTION,ANALYZE会自行提交,但这在管道化的命令序列中不应该发生。拒绝长度错误的取消请求包(Andrey Borodin)
即使取消请求的长度字段过小,服务器也会处理该请求。这导致读取超出已分配缓冲区的末尾。理论上这可能导致段错误,但在实际中不太可能发生,因为缓冲区需要非常接近内存末尾才会出现。更可能的结果是关于错误后端 PID 或取消码的虚假日志消息。改为对错误的长度发出报告。
在子查询提升中增加递归和循环防护(Tom Lane)
一个精心构造的查询可能导致深度递归和过多的时间用于尝试展平子查询。一个正确的修复对于后移来说过于侵入性,但至少我们可以增加堆栈深度检查和中断检查以允许取消查询。
修复按分区连接代码以容忍无法为每个分区生成计划的情况(Tom Lane)
这可能导致“could not devise a query plan for the given query”错误。
限制
get_actual_variable_range执行的清理工作量(Simon Riggs)在删除大量出现在索引末尾的元组之后立即进行的规划器运行,可能会花费大量工作来设置那些索引条目的“killed”位。通过在检查 100 个堆页面后放弃此过程来限制任何一次查询中的工作量。所有清理工作最终仍会完成,但不会出现如此大的性能波动。
确保在执行短语匹配时可以取消全文检索查询的执行(Tom Lane)
在复制连接尝试失败后清理 libpq 连接对象(Andres Freund)
之前的代码泄漏了连接对象。在后台代码路径中这基本无害,因为调用进程会放弃并退出。但在诸如
CREATE SUBSCRIPTION等命令中,此类失败会导致少量会话生命周期的内存泄漏。在热备服务器中,减少跟踪主库上已知活跃 XID 的处理开销(Simon Riggs,Michail Nikolaev)
对 KnownAssignedXids 数组清理不够积极可能导致性能下降,特别是在备库上
max_connections设置较大时。修复逻辑解码中未初始化内存的使用(Masahiko Sawada)
在某些情况下,逻辑解码的恢复可能会尝试重用已经释放的 XID 数据,导致不可预测的行为。
避免在 WAL 重放 hash 索引页面分裂操作期间出现罕见的“failed to acquire cleanup lock”恐慌(Robert Haas)
在 WAL 重放期间设置堆页面的 all-visible 位时推进页面的 LSN(Jeff Davis)
未能这样做会导致备库上的页面可能与主库不同,并违反了关于 LSN 何时更改的其他预期。就 PostgreSQL 本身而言,这似乎只是一个理论上的隐患,但可能影响第三方工具。
防止不安全地使用关系缓存条目的
rd_smgr指针(Amul Sul)移除各种假设
rd_smgr在一系列操作中始终有效的假定,通过将所有使用包装在一个函数中,在需要时重新计算。这防止了在一系列操作中途发生意外缓存刷新时出现的错误。修复
WaitEventSet逻辑中的潜在缓冲区溢出问题(Thomas Munro)基于
epoll和kqueue的实现,在其内部缓冲区大小与调用者输出缓冲区大小不同时,可能向内核请求过多的事件。该情况在已发布的 PostgreSQL 版本中尚未出现,但此错误对外部模块和未来的错误修复构成隐患。避免在 32 位构建中访问共享内存时出现名义上的未定义行为(Andres Freund)
clang 的未定义行为检测器对使用对齐不足的指针发出了警告。这在非调试构建中不太可能造成问题,但为了测试目的值得修复。
修复 ACL 检查中缓存查找失败消息的复制粘贴错误(Justin Pryzby)
原则上这些错误应该永远不会触发。但如果触发了,其中一些会报告错误类型的对象。
在 pg_dump 中,避免在获取要检查的表的锁之前调用不安全的服务器函数(Tom Lane,Gilles Darold)
pg_dump 使用某些服务器函数,如果检查的表被并发删除则可能失败。通过确保在深入查询表的属性之前获取访问共享锁,以及不对我们不打算导出的表应用此类函数,来避免此类失败。
修复
ALTER FUNCTION/PROCEDURE/ROUTINE...SET SCHEMA的 Tab 补全(Dean Rasheed)修复
contrib/seg在输入数字超过 127 位时不再崩溃或输出垃圾数据(Tom Lane)在
contrib/sepgsql中,避免较新版本的 libselinux 产生弃用警告(Michael Paquier)修复在使用 Strawberry Perl 时用 MSVC 构建 PL/Perl 的编译失败问题(Andrew Dunstan)
修复用 MSVC 构建的 PL/Perl 与用 gcc 构建的 Perl 库之间的不匹配问题(Andrew Dunstan)
此类组合之前可能导致“loadable library and perl binaries are mismatched”错误。
抑制来自 Perl 头文件的编译器警告(Andres Freund)
我们首选的编译器选项会对 Perl 头文件最近版本中出现的构造引发警告。在使用 gcc 时,我们可以用 pragma 来抑制这些警告。
修复 pg_waldump 使其在不丢弃未使用的 static-inline 函数的编译器上可以构建(Tom Lane)
将时区数据文件更新到 tzdata 2022g 版,以反映格陵兰和墨西哥的夏令时法规变更,并修正加拿大北部、哥伦比亚和新加坡的历史数据。
值得注意的是,一个新的时区 America/Ciudad_Juarez 从 America/Ojinaga 中分离出来。