版本日期: 2021-11-11
此版本包含 14.0 中的各种修补程序. 有关主要版本 14 中的新功能的信息,请参阅 第 E.2 节.
运行 14.X 的用户不需要转储/还原。
但是,请注意,使用物理复制的安装应在主服务器之前更新备用服务器,如在下面的第三个更新日志条目中解释的
此外, 还发现了几个可能导致索引崩溃的错误, 如下面几个更改日志条目所叙述. 如果有的话,在这些情况下, 建议在更新后对可能受影响的索引重新编制索引。
使服务器在 SSL 或 GSS 加密握手后拒绝无关数据 (Tom Lane)
能够将数据注入TCP连接的中间人可以将一些明文数据填充到所谓的加密保护数据库会话的开始中。 这可能会被滥用于向服务器发送伪造的SQL命令,尽管这只有在服务器不要求任何身份验证数据时才有效 (但是,依赖于 SSL 证书身份验证的服务器可能不会这样做。)
作为 PostgreSQL Project, 感谢Jacob Champion报告这个问题. (CVE-2021-23214)
在SSL或GSS加密握手后,使libpq拒绝无关数据(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)
一个并行的 VACUUM
将无法处理
低于 min_parallel_index_scan_size
的索引
如果表中至少有两个索引大于该大小,则为截止。 这可能导致这些索引损坏,
因为它们仍然包含对 VACUUM
移除的任何堆条目的引用; 使用此类索引的后续查询可能会返回不应该返回的行
T该问题不影响 autovacuum, 因为它不使用并行 vacuuming. 但是, 建议重新索引任何
具有正确索引大小的manually-vacuumed tables.
修复了 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 TIES
和 FOR 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)
虽然解析器接受了这一点,但它没有文档记录,实际上不起作用。
修复角点情况:数值精度损失 power()
(Dean Rasheed)
当第一个参数非常接近1时,结果可能不准确。
避免为备忘录计划选择错误的哈希相等运算符. (David Rowley)
此错误可能导致崩溃或查询结果不正确.
修复将子查询表达式拉入函数范围表条目时出现的计划程序错误 (Tom Lane)
如果函数 FROM
横向引用
某些子类型的输出-SELECT
早于
FROM
语句, 并且我们能够将子SELECT
展平到外部查询中,复制到函数表达式中的表达式没有被完全处理。这可能导致执行时崩溃
避免仅使用MCV统计信息来估计列的范围 (Tom Lane)
在某些情况下,ANALYZE
将
构建最常见值(MCV)列表,但不是直方图,甚至尽管MCV列表没有考虑所有观察值。
在这种情况下,不要让计划员单独使用MCV列表估计列值的范围。
修复子事务中门户快照的恢复 (Bertrand Drouvot)
如果一个过程提交或回滚一个事务,然后它的下一个重要操作在一个新的子事务中,则快照管理出错,导致指针悬空并可能崩溃。PL/pgSQL中的一个典型示例是COMMIT
,紧接着执行查询的BEGIN ... EXCEPTION
块.
如果事务在导出快照后失败,请正确清理(Dilip Kumar)
如果同一会话再次尝试导出快照,则这种疏忽只会导致问题。最可能的情况是创建一个复制槽(然后回滚),然后创建另一个复制口。
防止在备用服务器上对溢出的子事务跟踪进行环绕(Kyotaro Horiguchi, Alexander Korotkov)
这种疏忽可能会导致备用服务器上的性能显著下降(表现为过多的子事务RU流量)。
确保在升级备用服务器的过程中对准备好的事务进行了正确的说明 (Michael Paquier, Andres Freund)
有一个狭窄的窗口,可以从并发运行的会话拍摄的快照中省略准备好的事务。如果该会话随后使用快照执行数据更新,则可能会出现错误结果或数据损坏。
修复 “could not find RecursiveUnion”错误
当 EXPLAIN
尝试打印附加到WorkTableScan节点的筛选条件 (Tom Lane)
请确保重命名表时使用正确的锁级别 (Nathan Bossart, Álvaro Herrera)
由于历史原因, ALTER INDEX ... RENAME
可以应用于任何类型的关系. T重命名索引所需的锁定级别低于重命名表或其他类型的关系所需的锁级别,但代码错误地理解了这一点,只要命令拼写为 ALTER
INDEX
就会使用较弱的锁定级别.
在删除拥有同时删除的对象的角色时,避免空指针取消引用崩溃 (Álvaro Herrera)
防止 “snapshot reference leak” 警告
当 lo_export()
或相关函数失败时
修复为强制域表达式节点生成代码效率低下的问题 (Ranier Vilela)
在某些列表操作中避免O(N^2)行为 (Nathan Bossart, Tom Lane)
这些更改修复了几种情况下的处理速度慢问题,包括:当备用系统重放持有多个独占锁的事务时,在初级阶段;当许多文件在检查站;当散列聚合涉及多个批时; and when
pg_trgm
从复杂正则表达式中提取索引的条件 只有第一种情况有:实际上是从现场报道的,但他们看起来都像无效列表删除的合理后果。
在B树发布列表拆分周围添加更多防御检查 (Peter Geoghegan)
此更改应有助于检测涉及重复表TID的索引损坏。
在将NaN插入BRIN float8或float4 minmax_multi_ops索引时避免断言失败 (Tomas Vondra)
在制作构建中,这种情况会导致一个效率低下但实际上并不正确的索引。
允许 autovacuum 启动器进程更快地响应 pg_log_backend_memory_contexts()
请求 (Koyu Tanigawa)
修复HMAC哈希计算中的内存泄漏(Sergey Shinderuk)
当 huge_pages
on
当 shared_memory_type
是 sysv
(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。然而,转储无子分区表时可能会出现问题,因为不会持有相关锁.
修复了试图从8.3之前版本的服务器转储触发器定义时pg_dump 中的崩溃(Tom Lane)
修复关于无效大型对象pg_restoreTOC文件的错误消息中不正确的文件名 (Daniel Gustafsson)
确保 pgbench在发生套接字级故障后以非零状态退出 (Yugo Nagata, Fabien Coelho)
所需的行为是完成运行,然后以状态2退出.此外,修复此类错误的报告.
防止pg_amcheck检查临时关系以及无效或未就绪的索引 (Mark Dilger)
这避免了对几乎肯定会出现不一致的关系进行无用的检查.
使 contrib/amcheck
在备用服务器上运行时跳过未标记的表 (Mark Dilger)
这样做是合适的,因为这样的表将是空的,而未标记的索引已经得到了类似的处理.
改变 contrib/pg_stat_statements
来阅读
“query texts” 文件的单位最多为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一直在跟踪最合适的映射,因此开始
使用他们的数据.此更改不会影响任何现有在安装中,只有新初始化的集群.
为斐济、约旦、巴勒斯坦和萨摩亚的DST法律变更,以及巴巴多斯、库克群岛、圭亚那、纽埃、葡萄牙和汤加的历史修正,将时区数据文件更新为 tzdata2021e版>.
此外,太平洋/恩德伯里区已更名为太平洋/坎顿.此外,以下区域已被合并到附近人口较多的区域,自1970年以来,其时钟已与它们达成协议:非洲/阿克拉, 美洲/阿蒂科坎, 美国/布兰克-萨布隆, 美国/克雷斯顿, 美洲/库拉索, 美洲/拿骚, 美国/Port_of_Spain, Antarctica/DumontDUrville 和 Antarctica/Syowa.在所有这些情况下,以前的区域名称仍保留为别名.