pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
发行日期:. 2015-05-22
本次发布包含对 9.3.6 的多方面修复。 有关 9.3 大版本中新特性的信息,请参见 第 E.26 节。.
对于运行 9.3.X 的用户,不需要进行转储/恢复。
但是,如果你使用contrib/citext的regexp_matches()函数,请参见下面相关的变更日志条目。
不过,如果你是从早于 9.3.6 的版本升级, 请参见 第 E.20 节。
避免客户端恰在认证超时到期前断开时可能出现的崩溃(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 的回卷([Aacute]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()函数的视图或规则。
修复 HOT 更新后延迟排他约束检查不正确的问题(Tom Lane)
如果同一事务中稍后对一条可能违反延迟排他约束的新行进行了 HOT 更新(即没有索引列发生变化,且该行可以存回同一表页),那么最终执行检查时将报告排他约束被违反,即使新行最初与之冲突的行已被删除。
修复星型模式风格查询的规划(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” 错误,其他情况下也可能发生。
修复max_prepared_transactions过小时启动阶段可能出现的死锁(Heikki Linnakangas)
时间线切换后不再归档无用的预分配 WAL 文件(Heikki Linnakangas)
崩溃之后递归地对数据目录执行 fsync()(Abhijit Menon-Sen、Robert Haas)
这确保了若随后不久再发生崩溃时数据仍保持一致。(要有问题的话,第二次崩溃必须是系统级崩溃,而不只是数据库崩溃。)
修复自动清理启动器在收到 SIGTERM 之后发生错误时可能无法关闭的问题([Aacute]lvaro Herrera)
处理 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 的事务在提交时可能出现延迟,导致不良影响,例如所有同步副本都停机时会话在启动时卡住。还观察到使用同步复制时会话卡在追赶中断处理中;此修复也将解决该问题。
修复在临时表上操作哈希索引时崩溃的问题(Heikki Linnakangas)
修复哈希索引桶分裂期间(若其他进程正在并发修改该索引)可能失败的问题(Tom Lane)
在分析索引表达式期间检查中断(Jeff Janes)
ANALYZE 会多次执行索引表达式;如果此类表达式中存在慢速函数,就希望能在此循环结束之前取消 ANALYZE。
确保在通过SELECT FOR UPDATE、UPDATE或DELETE锁定行之后发生READ COMMITTED复查时,外部表的tableoid被正确报告(Etsuro Fujita)
在外部服务器用户映射的对象描述字符串中加入目标服务器的名称([Aacute]lvaro Herrera)
在编码转换的对象标识字符串中包含模式名([Aacute]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 条目的实际含义发生微妙且可能涉及安全性的变化,在次版本中这样做似乎并不妥当。)
在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, [Aacute]lvaro Herrera)
这一语法已被接受(但未写入文档)很长时间,但此前某些参数可能取自旧连接而非给定字符串,这被认为是不合适的。
抑制psql在某些平台上关于退出时未能写入~/.psql_history的错误抱怨(Tom Lane)
这一不当行为源自针对非常老(2006 年之前)的libedit版本中一个缺陷的变通方案。我们通过移除该变通方案修复了问题,但这会使仍在使用此类libedit版本的用户出现类似失败。建议:升级该库,或改用libreadline。
修复pg_dump判定哪些转换是不应转储的系统提供转换的规则(Tom Lane)
修复pg_dump在-Fd下未遵循-Z压缩级别选项的问题(Michael Paquier)
使pg_dump在选择转储顺序时考虑扩展配置表之间的外键关系(Gilles Darold、Michael Paquier、Stephen Frost)
这一疏忽可能导致生成的转储无法重新加载,因为外键约束会被瞬时违反。
避免并发会话创建和删除临时函数时pg_dump可能失败的问题(Tom Lane)
修复对仅由VALUES(...)构成但带有列别名的视图的转储(Tom Lane)
在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)。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。