↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 10
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

E.5. 发布版本 10.19 #

发布日期:. 2021-11-11

本次发布包含来自 10.18 的多项修复。有关 10 主版本新特性的说明,请参见第 E.24 节。

E.5.1. 迁移到版本 10.19

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

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

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

此外,如果是从早于 10.16 的版本升级,请参见第 E.8 节。

E.5.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 记录。

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

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

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

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

  • 修复 float4 和 float8 的 hash 函数,使其对 NaN 产生一致的结果(Tom Lane)

    由于 PostgreSQL 的浮点类型将所有 NaN 视为相等,hash 函数必须为所有按 IEEE 754 标准表示 NaN 的位模式生成相同的 hash 值。以前没有做到这一点,因此对于非规范的 NaN 值,hash 索引和基于 hash 的查询计划可能产生错误结果。(在大多数机器上,'-NaN'::float8 就是产生此类值的一种方法。)如果浮点列的 hash 索引有任何可能包含此类值,建议重建这些索引。

  • 防止在 wal_level = minimal 时,对 CREATE TABLESPACE 进行崩溃恢复导致数据丢失(Noah Misch)

    如果服务器在 CREATE TABLESPACE 与下一次检查点之间崩溃,重放会完全删除新表空间目录中的内容,并依靠后续 WAL 重放来恢复目录中的一切。这与跳过 WAL 写入的优化配合不当(例如向刚创建的表执行 COPY)。此类优化仅在 wal_level 为 minimal 时应用,而这并非 v10 及更新版本的默认设置。

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

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

  • 确保创建或删除 FOR ALL TABLES 发布时使关系缓存失效(Hou Zhijie,Vignesh C)

    这一疏漏可能导致不正确的复制行为,直到所有当前已存在的会话都退出。

  • 不要丢弃未指定类型修饰符的同类型转换(Tom Lane)

    例如,如果列 f1 的类型为 numeric(18,3),解析器以前会直接丢弃 f1::numeric 这样的类型转换,理由是它在运行时没有任何作用。这一点没错,但表达式对外呈现的类型仍应视为普通的 numeric,而非 numeric(18,3)。这对于正确确定更大结构的类型很重要,例如递归 UNION。

  • 如果当前数据库的编码不支持某个 ICU 排序规则,则禁止创建该排序规则(Tom Lane)

    以前允许这样做,但由于排序规则查找的工作方式,之后无法引用该排序规则;既不能使用它,甚至也不能删除它。

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

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

  • 避免 {0} 内部存在捕获括号时出现正则表达式错误(Tom Lane)

    (.){0}...\1 这样的正则表达式会产生“invalid backreference number”错误。但 Perl 等其他正则表达式引擎不会报错,而且在一些非常相近的情况下,我们的引擎也不会报错。更糟的是,它还可能触发断言失败。现在修复为不抛出错误,而是静默地将该反向引用视为永不匹配。

  • 防止正则表达式的反向引用有时在不应匹配的情况下匹配(Tom Lane)

    正则表达式引擎在拒绝一个部分匹配后,没有仔细清除捕获括号的匹配数据。这可能使后续的反向引用在本应因没有已定义的引用对象而失败的位置匹配成功。

  • 修复迭代节点内部反向引用的正则表达式性能缺陷(Tom Lane)

    错误的回溯逻辑可能使寻找匹配所花费的时间呈指数级增长。幸运的是,其他优化在大多数情况下掩盖了此问题。

  • 修复对 time with time zone 值应用 AT TIME ZONE 时产生的错误结果(Tom Lane)

    如果目标时区通过动态时区缩写指定(即定义为等价于完整时区名称,而非固定 UTC 偏移量的缩写),结果就会不正确。

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

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

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

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

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

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

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

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

  • 修复对已增长到最大允许长度的关系的检测(Tom Lane)

    虽然尝试将表或索引扩展到超过 2^32-1 个块的限制会被拒绝,但拒绝得不够早,未能防止产生不一致的内部状态。

  • 展开 DO INSTEAD 规则时,正确跟踪是否存在修改数据的 CTE(Greg Nancarrow,Tom Lane)

    以前未能做到这一点,可能导致不安全地选择并行计划等问题。

  • 修复对扩展统计对象权限检查失败的不正确报告(Tomas Vondra)

    代码通常会产生“cache lookup error”,而非预期的消息。

  • 修复并行工作进程中不正确的快照处理(Greg Nancarrow)

    如果事务隔离级别低于 REPEATABLE READ,这一疏漏可能导致并行查询行为异常。

  • 确保 WAL 接收进程进程在退出前创建所有必需的归档通知文件(Fujii Masao)

    如果 WAL 接收进程恰好在 WAL 段边界处退出,它就不会为最后接收的段创建通知文件,从而延迟该段在备库上的归档。

  • 避免尝试锁定使用 SELECT FOR UPDATE 的规则中的 OLD 和 NEW 伪关系(Masahiko Sawada,Tom Lane)

  • 修复解析器对聚合 FILTER 子句的处理(Tom Lane)

    如果 FILTER 表达式是普通的布尔列,聚合的语义层级可能被错误判定,从而产生不符合规范的行为。如果 FILTER 表达式本身是返回布尔值的聚合,本应抛出错误却没有,因而很可能在执行时崩溃。

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

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

  • 确保统计视图会计入对 SP-GiST 索引的扫描(Tom Lane)

    SP-GiST 代码遗漏了递增索引扫描次数计数器的操作,虽然逐元组计数器已被正确递增。

  • 如果在恢复期间修改 recovery_min_apply_delay,则重新计算相关等待间隔(Soumyadeep Chakraborty,Ashwin Agrawal)

  • 修复 simplehash.h hash 表达到 2^32 个元素时的无限循环(Yura Sokolov)

    此缺陷似乎不太可能在实践中被触发,因为就 simplehash.h 的现有用途而言,需要将 work_mem 设置为数百 GB 才会出现。

  • 减少计算扩展统计信息时的内存消耗(Justin Pryzby,Tomas Vondra)

  • 修复 ecpg,使其在建立连接期间 malloc() 失败后能够正确恢复(Michael Paquier)

  • 允许使用 EXIT 退出 PL/pgSQL 例程的最外层块(Tom Lane)

    如果例程不要求显式 RETURN,这种用法应该有效,但以前会被拒绝。

  • 移除 pg_ctl 对生成命令总长度的硬编码限制(Phil Krylov)

    例如,这移除了对可传递给 postmaster 的命令行选项数量的限制。pg_ctl 处理的单个路径名,例如 postmaster 可执行文件名或数据目录名,在大多数情况下仍限制为 MAXPGPATH 字节。

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

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

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

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

  • 避免逐表查询 RLS 策略和重复调用 format_type(),从而提高 pg_dump 的性能(Tom Lane)

    这些修改在从本地服务器转储时只能带来小幅提升,但从远程服务器转储时,可以因网络往返次数减少而获益显著。

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

  • 修复对 "char" 列(而非 char(n) 列)的 contrib/btree_gin 索引使用 < 或 <= 操作符进行索引扫描时的失败(Tom Lane)

    这样的索引扫描无法返回所有应返回的条目。

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

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

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

  • 增加对 RISC-V 架构的自旋锁支持(Marek Szuba)

    这对于在该平台上获得合理的性能至关重要。

  • 支持 OpenSSL 3.0.0(Peter Eisentraut,Daniel Gustafsson,Michael Paquier)

  • 为 PostgreSQL 创建的 OpenSSL BIO(I/O 抽象)对象设置正确的类型标识符(Itamar Gafni)

    这一疏漏可能只对执行审计 OpenSSL 安装等任务的代码有影响。但严格来说,这违反了 OpenSSL API,因此予以修复。

  • 使 pg_regexec() 能够稳健地处理超出范围的 search_start 参数(Tom Lane)

    当 search_start 超过字符串末尾时,返回 REG_NOMATCH,而不再可能崩溃。核心 PostgreSQL 中可能不会出现这种情况,但扩展可能对参数值不够谨慎。

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

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

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

  • 将时区数据文件更新到 tzdata 2021e 版,以反映斐济、约旦、巴勒斯坦和萨摩亚的夏令时法规变更,并修正巴巴多斯、库克群岛、圭亚那、纽埃、葡萄牙和汤加的历史数据。

    此外,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。在所有这些情况下,之前的时区名称仍作为别名保留。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.