↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.6
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

E.1. 版本 9.6.24 #

发布日期:. 2021-11-11

此版本包含自 9.6.23 以来的多种修复。有关 9.6 大版本中新特性的信息,参见第 E.25 节。

这预计是 9.6.X 系列的最后一个 PostgreSQL 版本。建议用户尽快更新到较新的版本分支。

E.1.1. 迁移到版本 9.6.24

对于运行 9.6.X 的用户,不需要转储/恢复。

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

此外,还发现了几个可能导致索引损坏的 bug,如接下来几条变更日志条目所述。如果其中任何情况适用于你,建议在更新之后对可能受影响的索引执行 REINDEX。

另外,如果你是从 9.6.21 之前的版本升级,参见第 E.4 节。

E.1.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)中,如果并发构建索引时可能发生过此问题,建议对这些索引执行 REINDEX。

  • 避免可能导致后端进程无法把新行的条目加入正在并发构建的索引的竞态条件(Noah Misch、Andrey Borodin)

    虽然这种情况在实际中显然很少见,但它有可能影响任何使用 CONCURRENTLY 选项构建或重建的索引。建议对所有这类索引执行 REINDEX 以确保其正确。

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

    由于 PostgreSQL 的浮点类型认为所有 NaN 彼此相等,哈希函数就必须对 IEEE 754 标准中所有表示 NaN 的位模式产生相同的哈希码。此前这一点没有做到,这意味着哈希索引和基于哈希的查询计划可能对非规范 NaN 值产生错误结果。('-NaN'::float8 是在大多数机器上产生这种值的一种方式。)如果浮点列的哈希索引有可能包含这种值,建议对其执行 REINDEX。

  • 防止 wal_level = minimal 时 CREATE TABLESPACE 崩溃恢复期间的数据丢失(Noah Misch)

    如果服务器在 CREATE TABLESPACE 与下一个检查点之间崩溃,重放会完全移除新表空间目录的内容,并依赖后续的 WAL 重放来恢复该目录中的一切。这与跳过写 WAL 的优化(例如向刚创建的表执行 COPY)配合不佳。这类优化只在 wal_level 为 minimal 时应用,而 v10 及之后版本中这不再是默认值。

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

    例如,如果列 f1 的类型是 numeric(18,3),分析器过去会以它不会产生运行时效果为由,直接丢弃 f1::numeric 这样的强制转换。这没错,但表达式呈现出的类型仍应被视为普通 numeric,而不是 numeric(18,3)。这对于正确解析更大的构造(例如递归 UNION)的类型很重要。

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

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

  • 避免捕获圆括号位于 {0} 内部时引发的正则表达式错误(Tom Lane)

    形如 (.){0}...\1 的正则表达式会报“invalid backreference number”。其他正则引擎(例如 TCL)在这里不报错,因此这种模式可能在应用中被使用。

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

    正则引擎在拒绝部分匹配后,没有认真清除捕获圆括号的匹配数据。这可能使后面的反向引用在因缺少被引用者而应当失败的地方匹配成功。

  • 修复反向引用位于迭代节点内部时正则表达式的性能问题(Tom Lane)

    不正确的回溯逻辑可能导致寻找匹配的时间呈指数增长。幸运的是,该问题在大多数情况下被其他优化所掩盖。

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

    如果目标时区是由动态时区缩写(即定义为等价于完整时区名而非固定 UTC 偏移量的缩写)指定的,则结果是错误的。

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

    这一疏漏只有当同一会话再次尝试导出快照时才会造成问题。最可能的场景是创建一个复制槽(随后回滚),然后再创建另一个复制槽。

  • 防止备库服务器上溢出子事务追踪的回卷(Kyotaro Horiguchi、Alexander Korotkov)

    这一疏漏可能导致备库服务器显著的性能退化(表现为过多的 SubtransSLRU 流量)。

  • 确保在备库服务器提升期间正确统计预备事务(Michael Paquier、Andres Freund)

    在一个狭窄的时间窗口内,预备事务可能被并发运行会话所拍的快照遗漏。如果该会话随后使用该快照执行数据更新,可能导致错误结果或数据损坏。

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

    把表或索引扩展到 2^32-1 块上限的尝试会被拒绝,但拒绝得不够及时,未能阻止不一致的内部状态被创建。

  • 在扩展使用 DO INSTEAD 的规则时,正确跟踪存在数据修改 CTE 的情况(Greg Nancarrow、Tom Lane)

    此前未能做到这一点可能导致诸如不安全地选择并行计划之类的问题。

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

    如果 walreceiver 恰好在 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)

  • 修复 ecpg 在建立连接期间 malloc() 失败后不能正确恢复的问题(Michael Paquier)

  • 允许在 PL/pgSQL 例程最外层块中使用 EXIT(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 未能正确转储这条受限的权限授予。

  • 通过避免为 RLS 策略逐表查询、避免重复调用 format_type() 来改进 pg_dump 的性能(Tom Lane)

    从本地服务器转储时这些更改只有边际改进,但从远程服务器转储时,由于网络往返次数减少,可以获得显著的收益。

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

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

    这种索引扫描没有返回它本应返回的所有条目。

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

    这么大的查询文本文件非常罕见,但一旦出现,原来的编码在 Windows 64 上会失败(该平台拒绝超过 2GB 的单次读取请求)。

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

  • 为 RISC-V 架构添加自旋锁支持(Marek Szuba)

    这对该平台上的合理性能必不可少。

  • 在 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。在所有这些情况下,原时区名仍作为别名保留。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。