E.25. 版本 9.4.2 #
发布日期:. 2015-05-22
本发行版包含对 9.4.1 的多项修复。有关 9.4 主版本中新功能的信息,请参见第 E.27 节。
E.25.1. 迁移到版本 9.4.2
对于运行 9.4.X 的用户,不需要转储/恢复。
但是,如果你使用contrib/citext的regexp_matches()函数,请参见下面相关的变更日志条目。
另外,如果你是从早于 9.4.1 的版本升级,请参见第 E.26 节。
E.25.2. 变更
避免客户端恰在认证超时到期前断开时可能出现的崩溃(Benkocs Norbert Attila)
如果超时中断在会话关闭序列进行到一半时触发,SSL 相关状态会被释放两次,通常导致崩溃并对其他会话造成服务拒绝。实验表明,未经认证的远程攻击者能够相当稳定地触发此缺陷,因此按安全问题处理。(CVE-2015-3165)
改进对系统调用失败的检测(Noah Misch)
我们替换实现的
snprintf()未检查底层系统库调用报告的错误;可能被遗漏的主要情况是内存耗尽。在最坏情况下,由于我们的代码假定缓冲区已被覆写而实际未覆写,这可能导致信息暴露。此外,还有少数地方对安全相关的其他系统库函数调用未检查失败。仍有可能某些对
*printf()族函数的调用在恰逢内存耗尽错误时存在信息泄露风险。我们判断风险不大,但将继续在此领域进行分析。(CVE-2015-3166)在
contrib/pgcrypto中,统一将解密失败报告为“Wrong key or corrupt data”(Noah Misch)此前,某些使用错误密钥解密的情况可能报告其他错误消息文本。已经证明,这种错误报告的差异可能帮助攻击者从其他系统恢复密钥。虽然尚不清楚
pgcrypto的具体行为是否同样可被利用,但使用统一消息来避免风险似乎更好。(CVE-2015-3167)防御多事务成员 ID 的回卷(Álvaro Herrera、Robert Haas、Thomas Munro)
在某些使用模式下,现有的防御措施可能不够,导致
pg_multixact/members文件被过早移除,造成数据丢失。修复包括:修改服务器使会导致覆写旧多事务成员 ID 数据的事务失败,并改进自动清理以确保它能像防御事务 ID 回卷那样主动防御多事务成员 ID 回卷。修复
contrib/citext的regexp_matches()函数的错误声明(Tom Lane)这些函数应当像它们所包装的核心函数一样返回
setof text[];但它们被错误地声明为只返回text[]。这一错误有两个后果:第一,如果没有匹配,得到的是标量 null 结果,而正确的应该是空集(零行)。第二,g标志实际上被忽略了,因为即使有多个匹配也只会得到一个结果数组。虽然后一种行为显然是缺陷,但可能有应用程序依赖前一种行为;因此在PostgreSQL 9.5 之前默认不会更改函数声明。在 9.5 之前的分支中,旧行为存在于
citext扩展的版本 1.0 中,而我们在版本 1.1 中提供了修正后的声明(不默认安装)。要在 9.5 之前的分支中采用修复,请在安装了citext的每个数据库中执行ALTER EXTENSION citext UPDATE TO '1.1'。(如果需要撤销,也可以“更新”回 1.0。)请注意,任一更新方向都需要删除并重新创建所有使用citext的regexp_matches()函数的视图或规则。转换为
json时将无穷日期和时间戳呈现为infinity,而不是抛出错误(Andrew Dunstan)修复
json/jsonb的populate_record()和to_record()函数对空输入的处理(Andrew Dunstan)修复 HOT 更新后延迟排他约束检查不正确的问题(Tom Lane)
如果同一事务中稍后对一条可能违反延迟排他约束的新行进行了 HOT 更新(即没有索引列发生变化,且该行可以存回同一表页),那么最终执行检查时将报告排他约束被违反,即使新行最初与之冲突的行已被删除。
修复用
ALTER TABLE ... ALTER CONSTRAINT更改外键约束可延迟状态时的行为(Tom Lane)同一会话中稍后的操作或并发会话中的操作可能不会立即遵循该状态变更。
修复星型模式风格查询的规划(Tom Lane)
有时,对大表的高效扫描要求索引参数来自不止一个其他表(通常是维度表,其键用于对大型事实表建立索引)。规划器应当能找到此类计划,但一个过于严苛的搜索启发式阻止了这一点。
防止反连接(NOT EXISTS 连接)与其他外连接之间的不当重排序(Tom Lane)
已知规划器中的这一疏忽会导致 “could not find RelOptInfo for given relids” 错误,但有时错误的查询计划似乎有可能通过该一致性检查并导致静默错误的查询输出。
修复外连接计划节点中子表达式匹配不正确的问题(Tom Lane)
此前,如果文本相同的非严格子表达式在外连接的上、下方都被使用,规划器可能试图重用在连接下方计算的值,但这是不正确的,因为对于未匹配的外部行,执行器会将该值强制置为 NULL。
修复 GEQO 规划器以应对其连接顺序启发式的失败(Tom Lane)
已知这一疏忽会在涉及
LATERAL的查询中导致 “failed to join all relations together” 错误,其他情况下也可能发生。确保当
UPDATE或DELETE的目标是安全屏障视图时正确进行行锁定(Stephen Frost)数据库启动期间同步复制槽数据时使用以读写方式打开的文件(Andres Freund)
在某些平台上,以前的编码可能导致类似 “could not fsync file "pg_replslot/...": Bad file descriptor” 的错误。
修复
max_prepared_transactions过小时启动阶段可能的死锁(Heikki Linnakangas)时间线切换后不再归档无用的预分配 WAL 文件(Heikki Linnakangas)
崩溃之后递归地对数据目录执行
fsync()(Abhijit Menon-Sen、Robert Haas)这确保了若随后不久再发生崩溃时数据仍保持一致。(要有问题的话,第二次崩溃必须是系统级崩溃,而不只是数据库崩溃。)
修复自动清理启动器在收到 SIGTERM 之后发生错误时可能无法关闭的问题(Álvaro Herrera)
修复会话启动早期未能处理系统目录失效消息的问题(Tom Lane)
这一疏忽可能导致与系统目录上的
VACUUM FULL并发启动的会话出现失败。修复试图获取刚刚退出的后端进程状态时
BackendIdGetTransactionIds()的崩溃(Tom Lane)处理
LockBufferForCleanup()中的意外信号(Andres Freund)这一疏忽可能导致有关 “multiple backends attempting to wait for pincount 1” 的虚假错误。
修复向带有包含整行引用的检查约束的表执行
COPY IN时的崩溃(Tom Lane)已知的失败情形只在 9.4 及以上版本中崩溃,但 9.3 和 9.2 中也有非常相似的代码,因此这些分支也被向后修补。
就用户而言是只读的事务,在提交期间不再等待 WAL 刷写或同步复制(Andres Freund)
此前,由于 HOT 页清理而写入了 WAL 的事务在提交时可能出现延迟,导致不良影响,例如所有同步副本都停机时会话在启动时卡住。还观察到使用同步复制时会话卡在追赶中断处理中;此修复也将解决该问题。
避免在使用较短的
recovery_min_apply_delay值时忙等待(Andres Freund)修复操作临时表上的哈希索引时的崩溃(Heikki Linnakangas)
修复其他进程并发修改索引时哈希索引桶分裂可能失败的问题(Tom Lane)
修复 GIN 索引清理中的内存泄漏(Heikki Linnakangas)
在分析索引表达式期间检查中断(Jeff Janes)
ANALYZE会多次执行索引表达式;如果此类表达式中存在慢速函数,就希望能在此循环结束之前取消ANALYZE。确保在
SELECT FOR UPDATE、UPDATE或DELETE锁定行之后发生READ COMMITTED重新检查时,正确报告外部表的tableoid(Etsuro Fujita)在外部服务器用户映射的对象描述字符串中加入目标服务器的名称(Álvaro Herrera)
在转换的对象标识字符串中包含模式名(Álvaro Herrera)
建议在使用 Kerberos/GSSAPI/SSPI 认证时将
include_realm设置为 1(Stephen Frost)不这样设置的话,来自不同领域的同名用户无法区分。目前这只是文档变更,但在 PostgreSQL 9.5 中它将成为默认设置。
移除将 IPv4
pg_hba.conf条目匹配到 IPv4-in-IPv6 地址的代码(Tom Lane)这段应急代码于 2003 年添加,起因是当时的某些 Linux 内核会把 IPv4 连接报告为 IPv4-in-IPv6 地址。然而该逻辑在 9.0 中被意外破坏。此后没有任何现场投诉,说明它已不再需要。现在反而有报告称被破坏的代码在某些系统上导致崩溃,因此我们选择直接移除而不是修复它。(如果选择修复,将会使 IPv4
pg_hba.conf条目的实际含义发生微妙且可能涉及安全性的变化,在次版本中这样做似乎并不妥当。)修复对从未真正启动即终止的后台工作进程的状态报告(Robert Haas)
数据库崩溃之后,不再重启标记为
BGW_NEVER_RESTART的后台工作进程(Amit Khandekar)在
IDENTIFY_SYSTEM复制命令中报告 WAL 刷写位置而非插入位置(Heikki Linnakangas)这避免了pg_receivexlog可能出现的启动失败。
在 Windows 上关闭服务期间,定期向服务控制管理器发送状态更新以防它过早终止服务;并确保 pg_ctl 会等待关闭完成(Krystian Bigaj)
降低使用libpq非阻塞模式时网络死锁的风险(Heikki Linnakangas)
在发送大量数据时,定期排空输入缓冲区很重要,以防服务器已发送足够的响应数据导致其在输出上阻塞。(典型场景是服务器在
COPY FROM STDIN期间发送一连串 NOTICE 消息。)这在普通阻塞模式下工作正常,但在非阻塞模式下则不然。我们修改了libpq,使其在可能时顺便排空输入,但要完全防御此问题需要应用程序配合:应用程序应同时监视套接字的读就绪和写就绪条件,并确保在读就绪时调用PQconsumeInput()。修复 libpq 中 URI 连接串空值的误解析(Thomas Fanghaenel)
修复 ecpg 中的数组处理(Michael Meskes)
修复psql以合理处理作为
\connect第一个参数的 URI 和 conninfo 串(David Fetter、Andrew Dunstan, Álvaro Herrera)这一语法已被接受(但未写入文档)很长时间,但此前某些参数可能取自旧连接而非给定字符串,这被认为是不合适的。
抑制psql在某些平台上关于退出时未能写入
~/.psql_history的错误抱怨(Tom Lane)这一不当行为源自针对非常老(2006 年之前)的libedit版本中一个缺陷的变通方案。我们通过移除该变通方案修复了问题,但这会使仍在使用此类libedit版本的用户出现类似失败。建议:升级该库,或改用libreadline。
修复 pg_dump 判断哪些转换是不应转储的系统提供转换的规则(Tom Lane)
修复 pg_dump 中
-Z压缩级别选项与-Fd一起使用时未被遵循的问题(Michael Paquier)使pg_dump在选择转储顺序时考虑扩展配置表之间的外键关系(Gilles Darold、Michael Paquier、Stephen Frost)
这一疏忽可能导致生成的转储无法重新加载,因为外键约束会被瞬时违反。
避免并发会话创建和删除临时函数时 pg_dump 可能失败的问题(Tom Lane)
修复仅由
VALUES(...)构成但带有列别名的视图的转储(Tom Lane)确保在转储/还原期间视图的副本标识被正确设置为
nothing(Marko Tiikkaja)此前,如果视图涉及循环依赖,它最终可能带有不正确的副本标识属性。
在pg_upgrade中,强制新集簇使用时间线 1(Bruce Momjian)
此变更可防止因错误抱怨缺少 WAL 历史文件而导致的升级失败。
在 pg_upgrade 中,继续之前检查是否存在不可正常连接的数据库(Bruce Momjian)
在 pg_upgrade 中,在生成的
delete_old_cluster脚本中正确引用目录路径(Bruce Momjian)在pg_upgrade中正确保留数据库级冻结信息(Bruce Momjian)
这一疏忽可能导致
postgres和template1数据库中的表出现缺少 clog 文件的错误。在 Windows 上以受限权限运行 pg_upgrade 和 pg_resetxlog,使它们被管理员运行时不会失败(Muhammad Asif Naeem)
改进 initdb 和 pg_basebackup 扫描目录时对
readdir()失败的处理(Marco Nenciarini)修复
contrib/intarray中缓慢的排序算法(Tom Lane)修复 Sparc V8 机器上的编译失败(Rob Rowan)
消除 macOS 上的一些构建警告(Tom Lane)
将时区数据文件更新到 tzdata 发行版 2015d,涵盖埃及、蒙古和巴勒斯坦的夏令时法规变更,以及加拿大和智利的历史变更。同时为 America/Adak 时区采用修订后的时区缩写(HST/HDT 而非 HAST/HADT)。