发布说明

PostgreSQL 14.1

E.22. 发布版本 14.1 #

发布日期:. 2021-11-11

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

E.22.1. 迁移到版本 14.1 #

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

但是,请注意使用物理复制的安装应先更新备库再更新主库, 如下面第三个变更日志条目所述。

此外,已发现若干可能导致索引损坏的错误, 如接下来几个变更日志条目所述。如果存在上述任一情况, 建议在更新后重建可能受影响的索引。

E.22.2. 变更 #

  • 使服务器在 SSL 或 GSS 加密握手后拒绝多余的数据(Tom Lane) §

    能够向 TCP 连接注入数据的中间人攻击者可以在本应受加密保护的数据库会话开始时 塞入一些明文数据。 这可以被用来向服务器发送伪造的 SQL 命令, 不过只有在服务器不要求任何认证数据时才能生效。 (然而,依赖 SSL 证书认证的服务器很可能不会要求认证数据。)

    PostgreSQL 项目感谢 Jacob Champion 报告此问题。 (CVE-2021-23214)

  • 使 libpq 在 SSL 或 GSS 加密握手后拒绝多余的数据(Tom Lane) §

    能够向 TCP 连接注入数据的中间人攻击者可以在本应受加密保护的数据库会话开始时 塞入一些明文数据。 这可能被用来向客户端注入伪造的响应, 不过 libpq 行为的其他细节使得这比听起来更难实现。另一种攻击方式是 窃取客户端的密码或其他可能在会话早期发送的敏感数据。已证明 在受 CVE-2021-23214 漏洞影响的服务器上这是可能的。

    PostgreSQL 项目感谢 Jacob Champion 报告此问题。 (CVE-2021-23222)

  • 修复在主库发送以不完整 WAL 记录结尾的 WAL 段后崩溃时的物理复制问题 (Álvaro Herrera) § § § § §

    如果主库未能存活足够长的时间来完成写入不完整 WAL 记录的剩余部分, 则之前的崩溃恢复逻辑会回退并从不完整 WAL 记录的开头处重新覆盖写入 WAL。 这是有问题的,因为备库可能已有该 WAL 段的副本。 它们随后会看到不一致的下一个段,将无法在没有人工干预的情况下恢复。 为修复此问题,在崩溃后重新启动时不再跨越 WAL 段边界回退。 而是在下一个 WAL 段的开头写入一种新类型的 WAL 记录, 通知读取器不完整的 WAL 记录将永远不会被完成且必须被忽略。

    应用此更新时,最好先更新备库再更新主库, 这样如果主库发生崩溃,备库就已准备好处理这种新类型的 WAL 记录。

  • 确保并行 VACUUM 不会遗漏任何索引(Peter Geoghegan,Masahiko Sawada) §

    如果表还有至少两个大于 min_parallel_index_scan_size 阈值的索引,则并行 VACUUM 会无法处理低于该阈值的索引。 这可能导致那些索引变得损坏, 因为它们仍然包含对已被 VACUUM 移除的堆条目的引用; 使用此类索引的后续查询可能会返回不应返回的行。 此问题不影响 autovacuum,因为它不使用并行清理。 但是,建议对具有合适索引大小组合的手动执行清理的表重建索引。

  • 修复 CREATE INDEX CONCURRENTLY 以等待最新的预备事务(Andrey Borodin) §

    刚刚预备的事务插入的行可能会从新索引中遗漏, 导致依赖该索引的查询错过此类行。 之前对此类问题的修复未能考虑到在 CREATE INDEX CONCURRENTLY 检查时仍在进行中的 PREPARE TRANSACTION 命令。 与之前一样,在启用了预备事务(max_prepared_transactions > 0)的安装中,建议重建所有并发构建的索引, 以防在构建时发生了此问题。

  • 避免竞态条件导致后端无法将新行的条目添加到正在并发构建的索引中(Noah Misch,Andrey Borodin) §

    虽然此情况在实际环境中似乎很少发生,但它可能影响 使用 CONCURRENTLY 选项构建或重建的任何索引。 建议重建此类索引以确保其正确性。

  • 修复 REINDEX CONCURRENTLY 以保留附加到目标索引上的操作符类参数 (Michael Paquier) §

  • 修复克隆包含非内置对象的数据库时共享依赖关系的错误创建(Aleksander Alekseev) §

    此错误在实际中的影响可能是有限的。原则上, 它可能允许在角色仍拥有对象时被删除;但大多数安装永远不会想要删除 曾被用于向 template1 添加对象的角色。

  • 确保在将表附加到分区表或从分区表中分离时正确地使关系缓存失效(Amit Langote,Álvaro Herrera) §

    此疏忽可能导致直接对该分区进行后续插入/更新时出现错误行为, 但仅在当前已存在的会话中。

  • 修复创建范围类型时解析树的损坏(Alex Kozhemyakin,Sergey Shinderuk) §

    CREATE TYPE 错误地释放了解析树的一个元素, 这可能导致后续事件触发器出现问题,或者如果 CREATE TYPE 命令被存储在计划缓存中并在稍后再次使用时也会出问题。

  • 修复复合类型上域的数组中元素字段的更新问题(Tom Lane) §

    如果数组的元素是域而不是普通复合类型,则类似 UPDATE tab SET fld[1].subfld = val 这样的命令会失败。

  • 禁止 FETCH FIRST WITH TIESFOR UPDATE SKIP LOCKED 的组合(David Christensen) §

    FETCH FIRST WITH TIES 必然会多获取一行, 因为在找到非并列行之前它无法停止。在我们当前的实现中, 如果使用了 FOR UPDATE,那么该行也会被锁定,即使它不会被返回。 如果指定了 SKIP LOCKED 选项,则会导致不期望的行为。 在不引入另一组不期望行为的情况下很难改变这一点,因此目前禁止此组合。

  • 禁止 ALTER INDEX index ALTER COLUMN col SET (options)(Nathan Bossart,Michael Paquier) §

    虽然解析器接受此语法,但它没有文档记录且实际上不起作用。

  • 修复 numeric power() 在边界情况下的精度损失(Dean Rasheed) §

    当第一个参数非常接近 1 时,结果可能不准确。

  • 避免为 Memoize 计划选择错误的哈希相等操作符(David Rowley) §

    此错误可能导致崩溃或不正确的查询结果。

  • 修复将子查询表达式上拉到函数范围表条目时的规划器错误(Tom Lane) §

    如果 FROM 中的函数横向引用了 FROM 子句中 较早出现的某个子 SELECT 的输出, 并且我们能够将该子 SELECT 展平到外层查询中, 则复制到函数表达式中的表达式未被完全处理。 这可能导致执行时崩溃。

  • 避免仅使用 MCV 统计信息来估计列的范围(Tom Lane) §

    在某些边界情况下,ANALYZE 会构建最常见值(MCV)列表 但不构建直方图,即使 MCV 列表并未包含所有观测值。 在这种情况下,防止规划器仅使用 MCV 列表来估计列值的范围。

  • 修复子事务内部 Portal 快照的恢复(Bertrand Drouvot) §

    如果过程提交或回滚了一个事务,然后其下一个重要操作在新的子事务内部, 快照管理会出错,导致悬挂指针和可能的崩溃。 PL/pgSQL 中的一个典型示例是 COMMIT 紧跟一个执行查询的 BEGIN ... EXCEPTION 块。

  • 确保在事务导出快照后失败时正确清理(Dilip Kumar) §

    此疏忽仅在同一会话再次尝试导出快照时才会导致问题。 最可能的场景是创建复制槽(随后回滚)然后再创建另一个复制槽。

  • 防止备库上溢出子事务跟踪的回卷(Kyotaro Horiguchi,Alexander Korotkov) §

    此疏忽可能导致备库上显著的性能下降 (表现为过多的 SubtransSLRU 流量)。

  • 确保在备库提升期间正确地将预备事务纳入考虑(Michael Paquier,Andres Freund) §

    存在一个很窄的窗口,预备事务可能从并发运行的会话获取的快照中被遗漏。 如果该会话随后使用该快照执行数据更新, 可能导致错误的结果或数据损坏。

  • 修复当 EXPLAIN 尝试打印附加到 WorkTableScan 节点上的 过滤条件时出现的 could not find RecursiveUnion 错误(Tom Lane) §

  • 确保在重命名表时使用正确的锁级别(Nathan Bossart,Álvaro Herrera) § §

    由于历史原因,ALTER INDEX ... RENAME 可以应用于任何类型的关系。重命名索引所需的锁级别低于 重命名表或其他类型关系所需的锁级别,但代码在此处出错, 每当命令拼写为 ALTER INDEX 时都会使用较弱的锁级别。

  • 避免在删除拥有正在被并发删除的对象的角色时出现空指针解引用崩溃(Álvaro Herrera) §

  • 防止当 lo_export() 或相关函数失败时出现 snapshot reference leak 警告(Heikki Linnakangas) § §

  • 修复 CoerceToDomain 表达式节点的低效代码生成(Ranier Vilela) §

  • 避免某些列表操作中的 O(N^2) 行为(Nathan Bossart,Tom Lane) § § §

    这些更改修复了多个场景中的慢处理问题,包括: 当备库重放主库上持有许多排他锁的事务时; 当检查点后有许多文件需要取消链接时; 当哈希聚合涉及许多批次时;以及当 pg_trgm 从复杂正则表达式中提取可索引条件时。 仅第一种场景实际上已在实际环境中被报告,但它们都似乎是 低效列表删除的合理后果。

  • 增加更多围绕 B-tree posting list 分裂的防御性检查(Peter Geoghegan) § §

    此更改应有助于检测涉及重复表 TID 的索引损坏。

  • 避免在将 NaN 插入 BRIN float8 或 float4 minmax_multi_ops 索引时出现断言失败(Tomas Vondra) §

    在生产构建中,此类情况会导致效率稍低但实际上并不错误的索引。

  • 允许 autovacuum 启动器进程更快地响应 pg_log_backend_memory_contexts() 请求(Koyu Tanigawa) §

  • 修复 HMAC 哈希计算中的内存泄漏(Sergey Shinderuk) §

  • shared_memory_typesysv 时,禁止将 huge_pages 设置为 on(Thomas Munro) §

    之前此设置会被接受,但由于缺乏实现而不起作用。

  • 修复 PL/pgSQL 中 RETURN QUERY 语句的查询类型检查(Tom Lane) §

    RETURN QUERY 应该接受任何能返回元组的查询, 例如 UPDATE RETURNING。v14 意外地只允许了 SELECT;此外,RETURN QUERY EXECUTE 变体完全没有进行任何查询类型检查。

  • 修复 pg_dump 以正确导出非全局默认权限(Neil Chen,Masahiko Sawada) §

    如果全局(不受限的)ALTER DEFAULT PRIVILEGES 命令撤销了某个默认存在的权限,例如函数的 EXECUTE,然后受限的 ALTER DEFAULT PRIVILEGES 命令又为选定的角色或模式重新授予了该权限, 则 pg_dump 无法正确导出受限的权限授予。

  • 使 pg_dump 对要导出的分区表获取共享锁(Tom Lane) §

    此疏忽通常是相当无害的,因为一旦 pg_dump 锁定了任何叶分区,就足以阻止对分区表本身的重大 DDL。 但是,在导出没有子分区的分区表时可能出现问题,因为不会持有相关的锁。

  • 修复 pg_dump 在尝试从 8.3 之前版本的服务器导出触发器定义时的崩溃(Tom Lane) §

  • 修复 pg_restore 关于无效大对象 TOC 文件的错误消息中的不正确文件名(Daniel Gustafsson) §

  • 确保 pgbench 在套接字级别失败后以非零状态退出(Yugo Nagata,Fabien Coelho) § §

    期望的行为是完成运行但随后以状态 2 退出。同时修复了此类错误的报告。

  • 防止 pg_amcheck 检查临时关系以及无效或未就绪的索引(Mark Dilger) § §

    这避免了对几乎肯定显示为不一致的关系进行无用的检查。

  • 使 contrib/amcheck 在备库上运行时跳过非日志表(Mark Dilger) §

    这样做是合适的,因为此类表将为空, 而非日志索引已经以类似方式处理。

  • 改变 contrib/pg_stat_statements 以最大 1GB 为单位读取其 查询文本 文件(Tom Lane) §

    如此大的查询文本文件非常不常见,但如果确实出现, 之前的代码在 Windows 64 上会失败(因为它拒绝超过 2GB 的单次读取请求)。

  • 修复 contrib/postgres_fdw 尝试报告数据转换错误时的空指针崩溃(Tom Lane) §

  • 确保 GetSharedSecurityLabel() 可以在尚未构建关键 关系缓存条目的新启动会话中使用(Jeff Davis) §

  • 运行 TAP 测试时,将模块自身的目录包含在 PATH 中(Andrew Dunstan) §

    这允许测试找到尚未安装的已构建程序,例如自定义测试驱动程序。

  • 使用 CLDR 项目的数据将 Windows 时区名称映射到 IANA 时区(Tom Lane) § § §

    在 Windows 上运行时,initdb 尝试将新集簇的 timezone 参数设置为与系统当前时区匹配的 IANA 时区。 我们使用的是多年前生成的映射表,并且只是零星地更新; 不出所料,它包含许多错误以及遗漏了最近添加的时区。 事实证明 CLDR 一直在跟踪最合适的映射,所以开始使用他们的数据。 此更改不会影响任何现有安装,仅影响新初始化的集簇。

  • 将时区数据文件更新至 tzdata release 2021e,包含斐济、约旦、巴勒斯坦和萨摩亚的夏令时法律变更, 以及巴巴多斯、库克群岛、圭亚那、纽埃、葡萄牙和汤加的历史更正。(Tom Lane) §

    此外,Pacific/Enderbury 时区已重命名为 Pacific/Kanton。 同时,以下时区已合并到附近的、人口更多的时区中, 因为它们的时钟自 1970 年以来一直与之一致:Africa/Accra、 America/Atikokan、America/Blanc-Sablon、America/Creston、 America/Curacao、America/Nassau、America/Port_of_Spain、 Antarctica/DumontDUrville 和 Antarctica/Syowa。 在所有这些情况下,之前的时区名称仍作为别名保留。