E.21. 版本 9.3.5 #
发行日期:. 2014-07-24
本次发布包含对 9.3.4 的多方面修复。有关 9.3 大版本中新特性的信息,请参见第 E.26 节。.
E.21.1. 迁移到版本 9.3.5
对于运行 9.3.X 的用户,不需要进行转储/恢复。
不过,本版本纠正了 pg_upgrade 中的一个逻辑错误,以及某些 GiST 索引的索引损坏问题。请参见下面前两条变更日志,以确认你的安装是否受影响以及应采取的步骤。
不过,如果你是从早于 9.3.4 的版本升级,请参见第 E.22 节。
E.21.2. 变更
在 pg_upgrade 中,删除 initdb 遗留的
pg_multixact文件(Bruce Momjian)如果你使用了 9.3.5 之前版本的 pg_upgrade 把数据库集簇升级到 9.3,它可能遗留了一个本不应存在的文件
$PGDATA/pg_multixact/offsets/0000,该文件最终会在VACUUM中引发问题。然而,在常见情况下这个文件实际上是有效的,绝不能删除。要判断你的安装是否存在此问题,请以超级用户身份在集簇的任意数据库中运行以下查询:WITH list(file) AS (SELECT * FROM pg_ls_dir('pg_multixact/offsets')) SELECT EXISTS (SELECT * FROM list WHERE file = '0000') AND NOT EXISTS (SELECT * FROM list WHERE file = '0001') AND NOT EXISTS (SELECT * FROM list WHERE file = 'FFFF') AND EXISTS (SELECT * FROM list WHERE file != '0000') AS file_0000_removal_required;如果该查询返回
t,请手工删除文件$PGDATA/pg_multixact/offsets/0000。如果查询返回f,则无需任何操作。正确初始化
contrib/btree_gist在bit列上索引的填充字节(Heikki Linnakangas)这一错误可能导致本应比较相等的值不被视为相等,从而产生错误的查询结果。在
bit或bit varying列上建有 GiST 索引的用户,在安装此更新后应对这些索引执行REINDEX。在删除 GIN 列表页时防止残缺页(torn page)(Heikki Linnakangas)
此修复可防止在页面更新写入磁盘期间发生系统崩溃时可能出现的索引损坏。
在从 WAL 重放更新时不清除 GiST 索引页的右链接(Heikki Linnakangas)
这一错误可能导致热备中执行的 GiST 索引扫描出现瞬时错误的结果。
修复向 SP-GiST 文本索引插入时极端情况下的无限循环(Tom Lane)
修复 SP-GiST 索引搜索在使用
-|-(范围相邻)操作符时结果错误的问题(Heikki Linnakangas)修复
pg_multixact/members的回卷处理([Aacute]lvaro Herrera)在检查点期间而不是
VACUUM期间截断pg_multixact([Aacute]lvaro Herrera)此变更确保
pg_multixact段不会在崩溃后 WAL 重放期间仍被需要时就被删除。修复 WAL 恢复后全可见标志可能不一致的问题(Heikki Linnakangas)
修复嵌套调用
ReceiveSharedInvalidMessages期间缓存失效可能不正确的问题(Andres Freund)修复更新被其他进程并发锁定的元组时的竞态条件(Andres Freund、[Aacute]lvaro Herrera)
修复对从带继承子表的表读取的子查询执行
UNION ALL时规划器报 “could not find pathkey item to sort” 失败的问题(Tom Lane)当子查询的目标列表中存在集合返回函数时,不再假定其输出是唯一的(David Rowley)
这一疏忽可能导致诸如
WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y)之类的构造被错误优化。改进规划器,使其在可能时丢弃
AND/OR的常量 NULL 输入(Tom Lane)此变更修复了一些 9.2 及之后版本更激进的参数替换导致比旧版本生成的计划更差的情况。
确保规划器把等价的
VARIADIC与非VARIADIC函数调用视为相同(Tom Lane)例如,这一缺陷可能导致无法使用涉及可变参数函数的表达式索引。要让此修复对现有 9.3 安装生效,可能需要重建这类索引,和/或重建包含应与索引匹配的可变参数函数调用的视图。
修复
json_populate_recordset()及相关函数对嵌套JSON对象的处理(Michael Paquier、Tom Lane)嵌套的
JSON对象可能导致父对象先前的字段未出现在输出中。修复
to_json()及相关函数对输入类型类别的识别(Tom Lane)已知这曾导致
JSON结果中money字段加引号不当,其他数据类型也可能出现错误结果。修复未能对结构化类型的组合元素中的字段执行解 TOAST 的错误(Tom Lane)
这纠正了 TOAST 指针可能未经解引用就被复制到其他表的情况。如果原始数据随后被删除,当这个已悬空的指针被使用时,会导致诸如 “missing chunk number 0 for toast value ...” 之类的错误。
修复对 Append 计划节点输出的整行引用导致 “record type has not been registered” 失败的问题(Tom Lane)
修复在回卷游标时调用用户定义函数可能崩溃的问题(Tom Lane)
修复为
FROM中的函数求值参数时查询级内存泄漏的问题(Tom Lane)修复正则表达式处理中的会话级内存泄漏(Tom Lane、Arthur O'Dwyer、Greg Stark)
修复
hungarian.stop中的数据编码错误(Tom Lane)防止在default_with_oids为真时创建带 OIDS 的外部表(Etsuro Fujita)
修复对在当前事务中插入、随后被一个现已回滚的子事务删除的行的活跃性检查(Andres Freund)
如果同一事务中稍后执行了
CREATE INDEX或CLUSTER,这可能导致问题(至少是虚假警告,最坏是无限循环)。在
PREPARE TRANSACTION期间清除pg_stat_activity.xact_start(Andres Freund)在
PREPARE之后,发起会话已不在事务中,因此不应继续显示事务开始时间。修复
REASSIGN OWNED对文本搜索对象失败的问题([Aacute]lvaro Herrera)防止
pg_class.relminmxid的值在VACUUM FULL期间倒退([Aacute]lvaro Herrera)减少规则/视图转储中的缩进,以提高可读性并避免过多空白(Greg Stark、Tom Lane)
此变更减少了对嵌套构造所施加的缩进量,包括一些用户可能并不认为是嵌套的情况,例如 UNION 列表。此前,深度嵌套的构造会以 O(N^2) 增长的空白打印,造成性能问题甚至有内存不足失败的风险。现在缩进以 40 为模缩减,乍看有些古怪,但相比简单限制缩进,似乎更好地保留了可读性。UNION 列表的冗余括号化也已减少。
修复当后续添加的列导致多个输入列与
USING说明匹配时规则/视图的转储问题(Tom Lane)修复某些涉及
FROM中返回包含已删除列的组合类型的函数的情况下的视图打印(Tom Lane)在 postmaster 启动期间阻塞信号(Tom Lane)
这确保了 postmaster 在例如启动过程中收到 SIGINT 时能够正确清理自身。
修复处理
pg_hba.conf中指定主机名而非 IP 地址的条目时的客户端主机名查找(Tom Lane)确保反向 DNS 查找失败会被报告,而不是只是静默地不匹配这些条目。同时确保每个连接只做一次反向 DNS 查找尝试,而不是每个主机名条目一次——如果查找尝试失败,此前发生的就是后者。
允许 root 用户使用
postgres -C variable和postgres --describe-config(MauMau)对以 root 身份启动服务器的禁止并不需要延伸到这些操作,放宽它可以避免 pg_ctl 在某些场景下的失败。
保护
make check期间启动的临时 postmaster 的 Unix 域套接字(Noah Misch)正如我们此前在 CVE-2014-0067 中指出的,任何能够访问套接字文件的本地用户都可以以服务器的引导超级用户身份连接,进而以运行测试的操作系统用户身份执行任意代码。此变更通过把服务器的套接字放到
/tmp下一个临时的、模式为 0700 的子目录中来防御这一风险。但在不支持 Unix 套接字的平台(尤其是 Windows)上风险仍然存在,因为那时临时 postmaster 必须接受本地 TCP 连接。此变更的一个有用副作用是简化了覆盖
DEFAULT_PGSOCKET_DIR的构建中的make check测试。常用的非默认值(如/var/run/postgresql)往往不允许构建用户写入,此前需要一些变通办法,现在不再需要了。修复表空间创建 WAL 重放在 Windows 上无法工作的问题(MauMau)
修复 Windows 上套接字创建失败的检测(Bruce Momjian)
在 Windows 上,允许新会话从配置文件获取 PGC_BACKEND 参数(例如log_connections)的值(Amit Kapila)
此前,如果启动后在文件中更改了这类参数,更改不会生效。
在 Windows 上正确地为可执行文件路径名加引号(Nikhil Deshpande)
如果安装路径同时包含空格和
@符号,这一疏忽可能导致 initdb 和 pg_upgrade 在 Windows 上失败。修复 macOS 上 libpython 的链接(Tom Lane)
我们先前使用的方法在 Xcode 5.0 及之后版本提供的 Python 库上可能失败。
当服务器持续以快于客户端吸收速度的速率发送数据时,避免 libpq 中的缓冲区膨胀(Shin-ichi Morita、Tom Lane)
libpq 可能被迫不断增大其输入缓冲区,直到内存耗尽(这会被误导性地报告为 “lost synchronization with server”)。在正常情况下,数据持续以快于
recv()循环吸收速度的速率传输是相当牵强的,但在客户端因调度器约束被人为减速时曾观察到这种情况。确保 libpq 中的 LDAP 查找尝试按预期超时(Laurenz Albe)
修复 ecpg 在
char *数组作为返回多行的 FETCH 语句目标时的行为,以及其他一些数组处理修复(Ashutosh Bapat)修复 pg_dump 处理依赖于表主键的物化视图的问题(Tom Lane)
当视图的查询依赖函数依赖性来精简
GROUP BY列表时就会发生这种情况。pg_dump 会困惑到把该物化视图当作普通视图转储。修复 pg_dumpall 的
-i开关的解析(Tom Lane)修复 pg_restore 对旧式大对象注释的处理(Tom Lane)
如果归档文件由 9.0 之前版本的 pg_dump 生成且包含较多大对象注释,直接恢复到数据库通常会失败。
修复新服务器创建了 TOAST 表而旧版本没有创建时 pg_upgrade 的问题(Bruce Momjian)
这种罕见情况会表现为 “relation OID mismatch” 错误。
在 pg_upgrade 中,保留旧集簇的
pg_database.datminmxid和pg_class.relminmxid值,或者在从 9.3 之前版本升级时插入合理的值;同时让核心服务器防御不合理的值(Bruce Momjian、[Aacute]lvaro Herrera、Tom Lane)这些变更防止了这样的场景:自动清理在新集簇启动后立即坚持扫描整个集簇的内容,或者对未冻结 MXID 值的跟踪被完全禁用。
防止
contrib/auto_explain改变用户EXPLAIN命令的输出(Tom Lane)如果
auto_explain处于活动状态,它可能导致EXPLAIN (ANALYZE, TIMING OFF)命令仍然打印计时信息。修复
contrib/dblink中的查询级内存泄漏(MauMau、Joe Conway)在
contrib/pgcrypto函数中,确保返回前清除栈变量中的敏感信息(Marko Kreen)防止
contrib/pgstattuple的pgstat_heap()使用已释放的内存(Noah Misch)在
contrib/uuid-ossp中,跨调用缓存 OSSP UUID 库的状态(Tom Lane)这提高了 UUID 生成的效率,并在有
/dev/urandom的平台上减少了从中抽取的熵量。把时区数据文件更新为 tzdata 版本 2014e,以反映克里米亚、埃及和摩洛哥的夏令时法规变更。