E.49. 版本 9.2.2 #
发行日期:. 2012-12-06
本次发布包含对 9.2.1 的多方面修复。有关 9.2 大版本中新特性的信息,请参见第 E.51 节。.
E.49.1. 迁移到版本 9.2.2
对于运行 9.2.X 的用户,不需要进行转储/恢复。
不过,你可能需要执行 REINDEX 操作来纠正并发构建的索引中的问题,如下面第一条变更日志条目所述。
另外,如果你是从 9.2.0 版本升级,参见第 E.50 节。
E.49.2. 变更
修复与
CREATE/DROP INDEX CONCURRENTLY相关的多个缺陷(Andres Freund、Tom Lane、Simon Riggs、Pavan Deolasee)添加
DROP INDEX CONCURRENTLY时引入的一个错误,允许在CREATE INDEX CONCURRENTLY的初始阶段做出错误的索引决策,导致该命令构建的索引可能损坏。建议在应用此更新后,重建 9.2.X 中用CREATE INDEX CONCURRENTLY构建的所有索引。此外,修复
CREATE/DROP INDEX CONCURRENTLY,使其在更改索引pg_index行的状态时使用就地更新。这防止了可能导致并发会话错过更新目标索引(从而再次产生损坏的并发创建索引)的竞态条件。另外,修复各种其他操作,确保它们忽略由失败的
CREATE INDEX CONCURRENTLY命令产生的无效索引。其中最重要的是VACUUM,因为在采取纠正措施修复或删除无效索引之前,很容易就有自动清理在该表上启动。还修复了
DROP INDEX CONCURRENTLY,使其在使用目标索引的所有查询完成之前不禁止向其插入。还修复了
DROP INDEX CONCURRENTLY被取消时的不当行为:先前的编码可能留下一个无法删除的索引。修正
DROP INDEX CONCURRENTLY的谓词锁定(Kevin Grittner)此前,SSI 谓词锁的处理时机不对,可能导致与
DROP并行执行的可序列化事务行为不正确。修复 WAL 重放期间的缓冲区锁定(Tom Lane)
WAL 重放代码在重放影响多个页面的 WAL 记录时,对缓冲区加锁不够谨慎。这可能导致热备查询瞬时看到不一致的状态,造成错误结果或意外失败。
修复 GIN 索引 WAL 生成逻辑中的一个错误(Tom Lane)
如果发生残缺页故障,这可能导致索引损坏。
修复 SP-GiST 索引 WAL 重放逻辑中的一个错误(Tom Lane)
这可能导致崩溃之后或备库服务器上的索引损坏。
修复 WAL 恢复期间对基础备份结束点的不正确检测(Heikki Linnakangas)
这一失误使热备模式可能在数据库达到一致状态之前就启动。
把热备服务器提升为正常运行时,正确移除启动进程的虚拟 XID 锁(Simon Riggs)
这一疏忽可能阻止后续执行某些操作,例如
CREATE INDEX CONCURRENTLY。避免备库模式下虚假的 “out-of-sequence timeline ID” 错误(Heikki Linnakangas)
防止 postmaster 在收到关闭信号后继续启动新的子进程(Tom Lane)
这一失误可能导致关闭耗时比应有的更长,甚至在没有额外用户操作的情况下永远无法完成。
修复
log_rotation_age超过 2^31 毫秒(约 25 天)时 syslogger 进程失败的问题(Tom Lane)修复
WaitLatch(),使其在请求的超时到期时立即返回(Jeff Janes、Tom Lane)在先前的编码下,持续不断的非等待终止中断可能无限期地延迟
WaitLatch()的返回。这已被证明会给自动清理启动器进程带来问题,也可能在其他地方造成麻烦。避免内存不足时内部哈希表损坏(Hitoshi Harada)
防止已删除表的文件描述符在事务结束之后仍保持打开(Tom Lane)
这应能减少早已删除的表继续占用磁盘空间的问题。
防止当新子进程无法为其闩锁创建管道时整个数据库崩溃并重启(Tom Lane)
虽然新进程必须失败,但没有充分理由强制整个数据库重启,因此避免这样做。这提高了内核文件描述符几乎耗尽时的健壮性。
避免与未展平子查询连接时规划器崩溃(Tom Lane)
修复外连接之上非严格等值子句的规划(Tom Lane)
规划器可能从把非严格构造与别的值等同的子句中推导出错误的约束,例如当
foo来自外连接的可空侧时的WHERE COALESCE(foo, 0) = 0。9.2 中出现这类错误的情况比以前的版本多,但基本缺陷已经存在很长时间。修复在继承树上对索引优化的
MIN/MAX使用SELECT DISTINCT的问题(Tom Lane)在这种因素组合下,规划器会报 “failed to re-find MinMaxAggInfo record” 失败。
确保规划器在所有用途上把隐式和显式转换视为等价,除了极少数确实存在语义差异的情况(Tom Lane)
在考虑查询能否使用部分索引时把连接子句也考虑在内(Tom Lane)
例如,一个严格连接子句就足以确立
xIS NOT NULL谓词。这修复了 9.2 中的一项规划器退化,因为以前的版本可以做类似的推导。限制当同一索引有大量可索引连接子句时规划时间的增长(Tom Lane)
改进规划器从等价类证明排他约束的能力(Tom Lane)
修复哈希子计划中的部分行匹配,使其正确处理跨类型情况(Tom Lane)
这影响多列
NOT IN子计划,例如WHERE (a, b) NOT IN (SELECT x, y FROM ...),当b和y分别是int4和int8时。根据所涉及的具体数据类型,这一失误会导致错误答案或崩溃。修复 btree 标记/恢复函数,使其处理数组键(Tom Lane)
这一疏忽可能导致内层是使用
条件的索引扫描的合并连接给出错误答案。indexed_column= ANY(array)撤销减少快照获取数量的补丁(Tom Lane)
9.2 中减少查询执行期间快照获取数量的变更导致了一些以前版本中未见的异常行为,因为执行会使用在锁定查询所用的表之前获取的快照继续进行。因此,例如即使前一事务持有排他锁,查询也不保证能看到该事务提交的更新。我们可能会在未来版本中重新处理这一点,但目前先恢复为 9.2 之前的方式。
在为
AFTER ROW UPDATE/DELETE触发器重新获取旧元组时获取缓冲区锁(Andres Freund)在非常罕见的情况下,这一疏忽可能导致向触发器
WHEN条件或外键强制触发器的预检查逻辑传递不正确的数据。这可能导致崩溃,或者在是否触发触发器上做出错误决定。修复
ALTER COLUMN TYPE以正确重建继承的检查约束(Tom Lane)这在 8.4 之前的版本中工作正常,现在在 8.4 及更高版本中也工作正常。
修复
ALTER EXTENSION SET SCHEMA未能把一些从属对象移入新模式的问题([Aacute]lvaro Herrera、Dimitri Fontaine)在扩展查询协议中正确处理
CREATE TABLE AS EXECUTE(Tom Lane)在
DROP RULE IF NOT EXISTS和DROP TRIGGER IF NOT EXISTS中不修改输入解析树(Tom Lane)如果这类已缓存语句被重新执行,这一失误会导致错误。
修复
REASSIGN OWNED对表空间授权的处理([Aacute]lvaro Herrera)忽略视图中系统列的不正确
pg_attribute条目(Tom Lane)视图没有任何系统列。然而,我们在把表转换为视图时忘记移除这类条目。这一问题在 9.3 及更高版本中已正确修复,但在以前的分支中,我们需要防御已经错误转换的视图。
修复规则打印,使其正确转储
INSERT INTO(Tom Lane)tableDEFAULT VALUES防止当查询中有过多
UNION/INTERSECT/EXCEPT子句时栈溢出(Tom Lane)防止用最小可能整数值除以 -1 时依赖平台的失败(Xi Wang、Tom Lane)
修复日期解析中可能越过字符串末尾的访问(Hitoshi Harada)
修复当 XID 回卷发生在检查点期间且
wal_level为hot_standby时 XID 纪元(epoch)未能推进的问题(Tom Lane、Andres Freund)虽然这一失误对 PostgreSQL 本身没有特别影响,但它对依赖
txid_current()及相关函数的应用不利:TXID 值看起来会倒退。修复
pg_terminate_backend()和pg_cancel_backend(),使其对不存在的目标进程不抛出错误(Josh Kupershmidt)这种情况下,超级用户调用时已经按预期工作,但普通用户调用时则不然。
修复
pg_stat_replication.sync_state在页边界处的显示(Kyotaro Horiguchi)当 Unix 域套接字的路径名长度超过平台特定限制时,生成可理解的错误消息(Tom Lane、Andrew Dunstan)
此前这会导致相当无用的结果,例如 “Non-recoverable failure in name resolution”。
修复向客户端发送组合列值时的内存泄漏(Tom Lane)
通过在提交时不搜索子事务锁来节省一些周期(Simon Riggs)
在持有大量排他锁的事务中,这种无用活动可能开销相当大。
使 pg_ctl 读取
postmaster.pid文件更健壮(Heikki Linnakangas)这修复了竞态条件和可能的文件描述符泄漏。
修复当呈现错误编码的数据且
client_encoding设置为仅客户端编码(如 SJIS)时 psql 可能崩溃的问题(Jiang Guiqing)让 pg_dump 把
SEQUENCE SET项转储到归档的数据节而不是前数据节(Tom Lane)这修复了
--data-only与--section=data含义之间不合需要的 inconsistency,还修复了被标记为扩展配置表的序列的转储。修复 pg_dump 在
--clean模式下对DROP DATABASE命令的处理(Guillaume Lelarge)从 9.2.0 开始,
pg_dump --clean会发出一条DROP DATABASE命令,根据使用场景的不同,这要么无用要么危险。它不再这样做。此变更还修复了--clean与--create的组合,使其合理工作,即在重新连接到目标数据库之前发出DROP DATABASE和CREATE DATABASE。修复 pg_dump 处理带循环依赖且无关系选项的视图的问题(Tom Lane)
先前对涉及循环依赖的视图转储关系选项的修复,在视图没有选项的情况下不能正确工作;它生成了语法无效的
ALTER VIEW foo SET ()。修复 pg_dump 以
tar输出格式生成的restore.sql脚本中的缺陷(Tom Lane)该脚本在表名包含大写字符时会直接失败。此外,让该脚本既能以常规 COPY 模式也能以
--inserts模式恢复数据。修复 pg_restore,使其接受符合 POSIX 的
tar文件(Brian Weaver、Tom Lane)pg_dump 的
tar输出模式的原始编码生成的文件并不完全符合 POSIX 标准。这在 9.3 版本中已得到纠正。此补丁更新了以前的分支,使它们同时接受错误格式和纠正后的格式,希望借此避免 9.3 发布时的兼容性问题。修复 pg_basebackup 生成的
tar文件,使其符合 POSIX(Brian Weaver、Tom Lane)修复 pg_resetxlog,使其在给定数据目录相对路径时正确定位
postmaster.pid(Tom Lane)这一失误可能导致 pg_resetxlog 没有注意到有活动 postmaster 正在使用该数据目录。
修复 libpq 的
lo_import()和lo_export()函数,使其正确报告文件 I/O 错误(Tom Lane)修复 ecpg 对嵌套结构指针变量的处理(Muhammad Usama)
修复 ecpg 的
ecpg_get_data函数,使其正确处理数组(Michael Meskes)防止 pg_upgrade 试图处理系统目录的 TOAST 表(Bruce Momjian)
这修复了当
information_schema被删除并重建后出现的错误。其他失败也可能出现。通过在新集簇中把
synchronous_commit设为off来改进 pg_upgrade 性能(Bruce Momjian)让
contrib/pageinspect的 btree 页面检查函数在检查页面时持有缓冲区锁(Tom Lane)规避
malloc(0)和realloc(NULL, 0)不可移植的行为(Tom Lane)在这些调用返回
NULL的平台上,一些代码误以为这意味着内存不足。已知这曾导致 pg_dump 在不含用户定义聚合的数据库上出错。可能还有其他情况。确保扩展的
make install会创建extension安装目录(C[eacute]dric Villemain)此前,如果扩展的 Makefile 设置了
MODULEDIR,就会漏掉这一步。修复 pgxs 在 AIX 上构建可加载模块的支持(Tom Lane)
在原始源码树之外构建模块在 AIX 上不工作。
把时区数据文件更新为 tzdata 版本 2012j for DST law changes in Cuba, Israel, Jordan, Libya, Palestine, Western Samoa, and portions of Brazil。