E.52. 版本 9.3.5

E.52.1. 迁移到版本 9.3.5
E.52.2. 修改列表

发布日期:. 2014-07-24

这个版本包含各种自9.3.4以来的修复。关于9.3主版本的新特性信息, 请查看第 E.57 节

E.52.1. 迁移到版本 9.3.5

运行9.3.X版本的用户不需要转储/恢复。

不过,这个版本纠正了pg_upgrade中的一个逻辑错误, 还有一些GiST索引中的索引损坏问题。 查看下面的前两条修改日志项找出你的安装是否受到了影响, 和受到影响后要采取的步骤。

另外,如果你是从一个早于9.3.4的版本升级而来, 请查看第 E.53 节

E.52.2. 修改列表

  • pg_upgrade中,删除initdb 留下的pg_multixact文件 (Bruce Momjian)

    如果你使用pg_upgrade 9.3.5之前的版本升级数据库集群到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则什么也不用做。

  • 正确的初始化bit字段上contrib/btree_gist 索引中的填充字节 (Heikki Linnakangas)

    这个错误会导致不正确的查询结果,因为值应该是比较相等而不是看做相等。 在bitbit varying字段上拥有GiST索引的用户应该在安装这个更新之后 REINDEX这些索引。

  • 在删除GIN列表页时保护页面不被撕裂 (Heikki Linnakangas)

    如果在将页更新写入磁盘时发生了系统崩溃,则该修复阻止了可能的索引损坏。

  • 在从WAL重放更新时,不要清理GiST索引页的右连接 (Heikki Linnakangas)

    这个错误会导致在热备份上执行的GiST索引扫描瞬态的错误回复。

  • 修复插入SP-GiST文本索引期间极端情况下的无限循环 (Tom Lane)

  • 修复带有-|-(范围邻接)操作符的SP-GiST索引搜索的错误回复 (Heikki Linnakangas)

  • 修复pg_multixact/members的概括处理 (Álvaro Herrera)

  • 在检查点期间而不是在VACUUM期间截断pg_multixact (Álvaro Herrera)

    这个修改确保了pg_multixact段在崩溃后的WAL重放期间, 如果还需要的话不会被删除。

  • 修复WAL恢复之后,所有可见标志的可能的不一致 (Heikki Linnakangas)

  • 修复嵌套调用ReceiveSharedInvalidMessages期间, 可能不正确的缓存失效 (Andres Freund)

  • 修复更新一个同时被另外一个进程锁定的元组时的竞态条件 (Andres Freund, Á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)

    这个bug会导致,例如未能使用包含可变函数的表达式索引。 重建这样的索引是很有必要的,或者重建应该匹配该索引的包括可变函数调用的视图, 以使存在于9.3安装中的修复生效。

  • 修复json_populate_recordset()及其相关中嵌套的 JSON对象的处理 (Michael Paquier, Tom Lane)

    嵌套的JSON对象会导致父对象以前的字段在输出中不显示。

  • 修复to_json()和相关函数中输入类型类别的识别 (Tom Lane)

    已经知道这会导致在JSON结果中不适当的引用money字段, 并且其他数据类型也可能有错误结果。

  • 修复构造类型的复合元素中未能detoast字段 (Tom Lane)

    这纠正了TOAST指针在没有解引用时就被拷贝到其他表的情况。 如果稍后删除了原始数据,那么在使用现在的悬摆指针时, 会导致像missing chunk number 0 for toast value ...这样的错误。

  • 修复整行引用作为附加计划节点的输出时, 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 INDEXCLUSTER, 那么会导致问题(至少是严重警告,最坏是无限循环)。

  • PREPARE TRANSACTION期间清理 pg_stat_activity.xact_start (Andres Freund)

    PREPARE之后,原始的会话不再存在于事务当中, 所以它不应该继续显示事务的开始时间。

  • 修复REASSIGN OWNED,不为文本搜索对象失败 (Álvaro Herrera)

  • 阻止pg_class.relminmxid值在 VACUUM FULL期间后退 (Álvaro Herrera)

  • 减少规则/视图转储中的缩进,提高可读性,并避免过多的空格 (Greg Stark, Tom Lane)

    这个修改减少了应用到嵌套结构的缩进数量,包括用户可能认为不是嵌套的情况, 比如UNION列表。以前,深度嵌套的结构带有大量的空格(以O(N^2)生长)打印, 造成了性能问题,甚至有内存溢出失败的风险。现在缩进降低了40倍, 最初看起来很奇怪,但是比简单的限制缩进看起来可读性更好一些。 UNION列表的多余括号也减少了。

  • 修复一个字段随后的添加导致多个输入字段匹配USING 说明时规则/视图的转储 (Tom Lane)

  • 修复视图打印,在FROM中包括函数,返回包含删除了的字段的复合类型的一些情况。 (Tom Lane)

  • 在主服务器启动期间闭塞信号 (Tom Lane)

    这确保了,比如,主服务器在启动时它自己收到SIGINT之后将正确的清理。

  • 修复处理声明主机名而不是IP地址的pg_hba.conf项时, 客户端主机名的查找 (Tom Lane)

    确保报告反DNS查找失败,而不只是默默的不匹配这样的项。 还要确保每个连接只有一个反DNS查找尝试,而不是每个主机名, 这是查找尝试失败时以前发生的情况。

  • 允许根用户使用postgres -C variablepostgres --describe-config (MauMau)

    作为根用户启动服务器的禁令不需要扩展这些操作, 并且放开它阻止了某些情况下pg_ctl的失败。

  • make check期间启动临时主服务器的安全的Unix域套接字 (Noah Misch)

    任何可以访问套接字文件的本地用户都可以作为服务器的引导超级用户连接, 然后继续执行任意代码作为操作系统用户运行测试, 就像我们之前在CVE-2014-0067提到的那样。 这个修改通过在临时文件、/tmp的模式为0700的子目录中替换服务器的套接字, 防卫了风险。在不支持Unix套接字的平台上,尤其是Windows,仍然存在风险, 因为临时主服务器必须接受本地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)

    这个疏忽会导致initdbpg_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语句的目标时, ecpg做正确的事情,还有一些其他数组处理的修复 (Ashutosh Bapat)

  • 修复pg_dump,处理依赖于表的主键的物化视图 (Tom Lane)

    如果视图的查询依赖于函数依赖来缩写GROUP BY列表,则会发生这种事情。 pg_dump会感到困惑,然后它将该物化视图当做普通视图转储了。

  • 修复pg_dumpall-i开关的分析 (Tom Lane)

  • 修复pg_restore对老风格的大对象注释的处理 (Tom Lane)

    如果pg_dump 9.0以前的版本生成的归档文件包含几个大对象的注释, 则从该归档文件直接到数据库的恢复通常会失败。

  • 修复新服务器创建TOAST表但是老版本不创建的pg_upgrade的情况 (Bruce Momjian)

    这个罕见情况会显示为relation OID mismatch错误。

  • pg_upgrade中,阻止来自老的集群的 pg_database.datminmxidpg_class.relminmxid值, 或者在从早于9.3的版本升级时插入合理的值; 还防卫了内核服务器中的不合理的值 (Bruce Momjian, Á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/pgstattuplepgstat_heap() 中使用早已释放的内存 (Noah Misch)

  • contrib/uuid-ossp中,在调用间缓存OSSP UUID库的状态 (Tom Lane)

    这提高了UUID生成的效率,并减少了从/dev/urandom获得的熵的数量, 在拥有它们的平台上。

  • 更新时区数据文件到tzdata版本2014e, 因为DST规律在Crimea、Egypt和Morocco发生了改变。