发布说明

PostgreSQL 14.2

E.21. 发布版本 14.2 #

发布日期:. 2022-02-10

本次发布包含来自 14.1 的多项修复。 有关 14 主版本新特性的说明,请参见 Section E.23

E.21.1. 迁移到版本 14.2 #

对于运行 14.X 的用户,不需要执行导出/恢复。

但是,已发现了一些可能导致索引损坏的错误,如前两个变更日志条目所述。 如果存在上述任一情况,建议在更新后重建可能受影响的索引。

此外,如果是从早于 14.1 的版本升级,请参见 Section E.22

E.21.2. 变更 #

  • 对 TOAST 表更新强制使用标准锁定协议,以防止 REINDEX CONCURRENTLY 出现问题(Michael Paquier) §

    如果对 TOAST 表或 TOAST 表的索引应用 REINDEX CONCURRENTLY,往往会产生损坏的索引。这是因为更新 TOAST 条目的会话 立即释放了其 ROW EXCLUSIVE 锁, 而不是像其他所有更新那样持有到事务提交。 修复方法是使 TOAST 更新按照正常规则持有表锁。 任何已损坏的索引都可以通过重建索引来修复。

  • 修复在页面修剪期间 RECENTLY_DEAD 元组变为完全 DEAD 状态时 HOT 链的损坏 (Andres Freund) §

    VACUUM 有可能在留下指向它的重定向项的同时 移除了最近死亡的元组。当该元组的项槽位后来被某个新元组重用时, 该新元组会被视为已有 HOT 链的一部分,造成一种索引损坏。 如果发生了这种情况,重建表的索引应该可以修复损坏。 但是,这是一种发生概率极低的场景,因此我们不建议仅凭可能发生就进行重新索引。

  • 修复对具有本地分区和外部分区混合的表进行 EvalPlanQual 重新检查时的崩溃 (Etsuro Fujita) § §

  • 修复 COPY TO 中的悬空指针(Bharath Rupireddy) §

    这一疏忽可能导致在 COPY 出错后出现不正确的错误消息或崩溃。

  • 避免在统计对象被并发删除时 ALTER STATISTICS 出现空指针崩溃(Tomas Vondra) §

  • 正确处理从多范围中提取范围时的对齐填充 (Alexander Korotkov) §

    这一错误可能在处理可变长度数据类型上的多范围时导致崩溃。

  • 修复对匿名 RECORD 数据类型过于乐观地使用哈希的问题 (Tom Lane) §

    这防止了某些情况下出现的 could not identify a hash function for type record 错误。

  • 修复并行单子节点 Append 节点的不正确计划创建(David Rowley) §

    在某些情况下,Append 在不应该被简化时被简化了, 导致错误的查询结果(重复行)。

  • 修复当并非所有索引列都可返回时的仅索引扫描计划 (Tom Lane) § §

    如果一个索引同时具有可返回列和不可返回列,且其中一个不可返回列是使用 出现在可返回索引列中的表列的表达式,那么使用该表达式的查询可能会产生一个 尝试读取不可返回列的仅索引扫描计划,而不是按预期从可返回列重新计算表达式。 不可返回列将读取为 NULL,导致错误的查询结果。

  • 修复 Memoize 计划节点以处理使用来自 Memoize 上层参数的子计划 (David Rowley) §

  • 修复 Memoize 计划节点以正确处理不可哈希的连接操作符 (David Rowley) §

  • 确保将类型转换到未指定的 typmod 时生成 RelabelType 节点 而非长度强制函数调用(Tom Lane) §

    虽然强制函数应该做正确的事情(即什么都不做), 但这种转换效率不必要地低下。

  • 修复 anycompatible 系列数据类型匹配的检查 (Tom Lane) §

    在某些情况下,解析器会认为具有 anycompatible 系列多态参数的 函数或操作符匹配了一组实际上不应匹配的参数。在已报告的案例中, 这导致对一个调用匹配了多个操作符,引发操作符歧义错误; 但之后出现失败也是可能的。

  • 修复当数据库一致性恰好在 WAL 页面边界处达到时的 WAL 重放失败 (Álvaro Herrera) §

  • 修复物理副本的启动以容忍事务 ID 回卷 (Abhijit Menon-Sen,Tomas Vondra) §

    如果副本服务器在主库上的活跃事务集跨越回卷边界时启动 (即有些较新的事务的 XID 比较旧的事务小), 副本将因 out-of-order XID insertion in KnownAssignedXids 而失败。副本会重试,但永远无法越过该错误。

  • 在逻辑复制中,避免重复传输子表的数据(Hou Zhijie) §

    如果一个发布同时包含子表和父表,并且设置了 publish_via_partition_root 选项, 订阅者会对子表和父表都无用地启动同步。 确保在这种情况下只同步父表。

  • 移除在逻辑复制连接上发出的 SQL 命令的词法限制(Tom Lane) § §

    walsender 进程会对包含未加引号的分号的 SQL 命令失败, 或者对包含奇数个单引号或双引号的美元引用字面量失败, 或者当 SQL 命令以注释开头时失败。 此外,错误的错误恢复可能导致后续命令也出现意外错误。

  • 确保在复制 ROLLBACK PREPARED 操作时 设置复制源时间戳(Masahiko Sawada) §

  • 修复事务的最后一个子事务的提交时间戳可能丢失的问题 (Alex Kingsborough,Kyotaro Horiguchi) §

  • 确保在检查点期间对 pg_logical/mappings 子目录执行 fsync(Nathan Bossart) §

    在某些文件系统上,这一疏忽可能导致在系统崩溃后丢失逻辑重写状态文件。

  • 为分区表构建扩展统计信息(Justin Pryzby) §

    之前的一个错误修复禁用了为旧式继承树构建扩展统计信息, 但它也阻止了为分区表构建这些统计信息,这是一个不必要的限制。 此变更允许 ANALYZE 计算分区表的统计对象的值。 (但请注意,自动清理本身不处理分区表,因此如果需要维护此类统计信息, 必须定期对分区表发出手动 ANALYZE。)

  • 忽略继承树的扩展统计信息(Justin Pryzby) §

    目前,扩展统计信息的值只是针对每个表本地计算的, 而不是针对整个继承树。但是,在规划跨继承树的查询时, 这些值被错误地参考了,可能导致比默认估计更差的结果。

  • 当分区表的行类型在其他地方被用作复合类型时, 禁止修改其列的数据类型(Tom Lane) §

    这一限制对于普通表早已存在,但由于疏忽,对分区表未做检查。

  • 禁止对作为副本标识索引一部分的列执行 ALTER TABLE ... DROP NOT NULL (Haiying Tang,Hou Zhijie) §

    对于主键索引已经存在相同的禁止规则。

  • ALTER TABLE ADD PRIMARY KEY USING INDEX 期间正确更新缓存的表状态(Hou Zhijie) §

    并发会话未能更新其关于表是否具有主键的判断, 可能导致不正确的逻辑复制行为。

  • 在切换 REPLICA IDENTITY 索引时正确更新缓存的表状态 (Tang Haiying,Hou Zhijie) §

    并发会话未能更新其关于哪个索引是副本标识索引的判断, 可能导致不正确的逻辑复制行为。

  • 修复当索引列的数据类型与操作符类声明的输入类型二进制兼容时 SP-GiST 索引的失败(Tom Lane) §

    这种情况应该可以工作,但失败并显示 compress method must be defined when leaf type is different from input type

  • 允许在计算最旧 xmin 时忽略并行清理和并发索引构建 (Masahiko Sawada) §

    这些操作的非并行化实例已经被忽略了, 但该逻辑对并行化的情况不起作用。推迟 xmin 范围会产生不良影响, 例如延迟清理操作。

  • 修复更新表达式索引时的内存泄漏(Peter Geoghegan) §

    影响很多行的 UPDATE 可能会消耗大量内存。

  • 避免在重新分配大量对象所有权的 REASSIGN OWNED BY 操作期间泄漏内存(Justin Pryzby) §

  • 通过避免不必要的缓存访问,改进 walsender 发送逻辑变更的性能 (Hou Zhijie) §

  • 修复 pg_hba_file_rules 视图中 cert 认证方法选项的显示(Magnus Hagander) §

    cert 认证方法隐含 clientcert=verify-full,但 pg_hba_file_rules 视图错误地报告了 clientcert=verify-ca

  • 确保 pg_log_backend_memory_contexts() 所针对的会话仅将其结果发送到服务器日志(Fujii Masao) §

    之前,如果 client_min_messages 设置得足够高, 日志消息也会被发送到已连接的客户端。由于该客户端并未请求该消息, 这会令人惊讶(并且可能违反线路协议)。

  • 修复出现在 INSERT ... VALUES 规则中的 整行变量的显示(Tom Lane) §

    整行变量会被打印为 var.*, 但这允许在规则重新加载时将其展开为各个列,导致不同的语义。 附加显式类型转换以防止这种情况,正如我们在其他地方所做的那样。

  • 在反向列出 SQL 标准函数体时,在 INSERT ... SELECT 中适当显示函数参数(Tom Lane) §

    之前,即使参数有名称,它们也会显示为 $N

  • 修复对空字符串应用 Unicode 字符串规范化时的一字节缓冲区溢出 (Michael Paquier) §

    由于对齐的考虑,这在实际中的影响是有限的;但在调试构建中,会引发警告。

  • 修复或移除一些不正确的断言 (Simon Riggs,Michael Paquier,Alexander Lakhin) § § § §

    这些错误应该只影响调试构建,不影响生产环境。

  • 修复在多线程使用 libpqecpglib 早期报告的错误消息 本地化失败的竞态条件(Tom Lane) §

  • 避免从 libpqPQcancel 函数中调用 strerror(Tom Lane) §

    PQcancel 应该可以安全地从信号处理程序中调用, 但 strerror 不是安全的。 这一错误用法仅在向服务器发送取消消息失败的不太可能的情况下才会发生, 这也许解释了为什么没有相关报告。

  • 使 psql\password 命令默认设置 CURRENT_USER 的密码, 而非连接的原始用户名(Tom Lane) §

    这与文档中描述的行为一致,并且避免了在会话开始后执行了 SET ROLESET SESSION AUTHORIZATION 时可能出现的权限失败。 为防止混淆,现在密码提示中包含了要操作的角色名称。

  • 修复 psql \d 命令中用于识别父触发器的查询(Justin Pryzby) §

    之前的代码在分区具有触发器且某个父分区表上存在同名的不相关语句级触发器时, 会失败并显示 more than one row returned by a subquery used as an expression

  • 使 psql\d 命令按名称而非 OID 排序表的扩展统计对象(Justin Pryzby) §

  • 修复 psql 对枚举类型标签值的 Tab 补全 (Tom Lane) §

  • 修复在 Windows 上使用终端作为数据源或目标时的失败 (Dmitry Koval,Juan José Santamaría Flecha,Michael Paquier) § §

    这影响 psql\copy 命令,以及带有 -f -pg_recvlogical

  • psql 和其他一些客户端程序中, 避免在 Ctrl-C 信号处理程序中尝试调用 gettext() (Tom Lane) §

    虽然没有已报告的失败可追溯到此错误,但这样做几乎不可能是安全的。

  • 允许取消 pg_receivewalpg_recvlogical 中的初始密码提示 (Tom Lane,Nathan Bossart) §

    之前在这些程序提示输入密码时无法通过 Ctrl-C 终止它们。

  • 修复 pg_dump 对用户定义类型转换的转储顺序 (Tom Lane) §

    在极少数情况下,输出脚本可能在用户定义类型转换被创建之前就引用了它。

  • 修复 pg_dump--inserts--column-inserts 模式以处理同时包含 生成列和已删除列的表(Tom Lane) § §

  • 修复 pg_dumppg_basebackup 中可能错误报告错误的问题 (Tom Lane) § §

    之前的代码未能检查某些内核调用的错误, 并且在其他情况下可能报告错误的 errno 值。

  • 修复 char(N) 列上 contrib/btree_gist 索引的仅索引扫描结果 (Tom Lane) §

    仅索引扫描返回的列值去除了尾部空格,这不是预期的行为。 这是因为数据就是以这种方式存储在索引中的。此修复更改代码以 使用预期的空格填充来存储 char(N) 值。 除非你执行 REINDEX,否则此类索引的行为不会立即改变; 在更新过程中,去除空格的值将逐渐被替换。 不使用仅索引扫描计划的查询在任何情况下都不受影响。

  • 修复 postgres_fdw 处理异步查询时的边界情况 (Etsuro Fujita) § §

    这些错误可能在尝试并行扫描外部表时导致崩溃或不正确的结果。

  • 更改 configure 以使用 Python 的 sysconfig 模块代替已弃用的 distutils 模块来确定如何构建 PL/Python (Peter Eisentraut,Tom Lane,Andres Freund) §

    对于 Python 3.10,这避免了在 configure 时出现关于 distutils 已弃用并计划在 Python 3.12 中移除的警告。想必一旦 3.12 发布, configure --with-python 将会完全失败。 这种面向未来的改进确实有一个代价:sysconfig 在 Python 2.7 之前不存在,在 Python 3 分支中在 3.2 之前也不存在, 因此不再可能针对早已停止维护的 Python 版本构建 PL/Python。

  • 重新允许在没有 OpenSSL 的情况下进行交叉编译 (Tom Lane) §

    configure 应该假定目标系统上有 /dev/urandom 可用,但实际上却失败了。

  • 修复在 Windows 上使用 Perl 5.28 及更高版本时的 PL/Perl 编译失败 (Victor Wagner) §

  • 修复在 Python 3.11 及更高版本上的 PL/Python 编译失败 (Peter Eisentraut) §

  • 增加对使用 Visual Studio 2022 构建的支持(Hans Buschmann) §

  • 允许 MSVC 构建系统中的 .bat 包装脚本 无需先切换到其所在目录即可调用 (Anton Voloshin,Andrew Dunstan) § §