2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 9.6.1, 9.5.5, 9.4.10, 9.3.15, 9.2.19 和 9.1.24 发布!

发布于 2016-10-27,作者:PostgreSQL 全球开发组

PostgreSQL 全球开发组发布了对其所有支持版本数据库系统的更新,包括 9.6.1, 9.5.5, 9.4.10, 9.3.15, 9.2.19 和 9.1.24。这也是 PostgreSQL 9.1 系列的最后一次更新,因为它已达到生命周期终点。本次发布修复了两个可能导致数据损坏的问题,详细信息请见下文。此外,还修补了过去三个月报告的许多其他 bug。项目敦促用户在下次停机时尽快应用此更新。

截断关系(truncated relations)的 WAL 日志记录

在此次发布之前,PostgreSQL 实例有时会尝试访问磁盘上已不存在的数据。如果空闲空间映射(free space map)未更新以识别截断,PostgreSQL 数据库可能会返回已截断的页面并产生类似以下错误的错误:

ERROR:  could not read block 28991 in file "base/16390/572026": read only 0 of 8192 bytes

如果启用了校验和(checksumming),可见性映射(visibility map)中的校验和失败也可能发生。

此问题存在于 PostgreSQL 9.3、9.4、9.5 和 9.6 系列版本中。

大端序(big-endian)机器上的 pg_upgrade 问题

在大端序机器上(例如许多非 Intel CPU 架构),pg_upgrade 会错误地写入可见性映射的字节,导致 pg_upgrade 无法完成。

如果您正在使用大端序机器(许多非 Intel 架构是大端序)并且曾使用 pg_upgrade 从 9.6 版本之前的版本进行升级,您应该假定所有可见性映射都是不正确的,需要重新生成。您可以使用 contrib/pg_visibility 的 pg_truncate_visibility_map() 函数截断每个关系(relation)的可见性映射。请阅读“更新”(Updating)部分中的安装后说明,了解如何解决 PostgreSQL 实例上的此问题。

此问题仅存在于 PostgreSQL 9.6.0 版本中。

错误修复和改进

除上述内容外,本次更新还修复了过去几个月报告的许多 bug。其中一些问题仅影响 9.6 系列,但许多问题影响所有支持的版本。本次发布提供了 50 多个修复,包括:

  • 修复使用 DISTINCT 的聚合函数执行时出现的“已使用后释放”(use-after-free)风险,可能导致崩溃
  • 修复作为窗口函数的多态聚合函数处理不正确,可能导致崩溃
  • 修复大端序机器上 GIN 索引 WAL 记录创建不正确
  • 修复截断大于 1GB 的临时关系时文件描述符泄露
  • 修复在具有主键(PRIMARY KEY)或副本标识(REPLICA IDENTITY)索引的表上批量 UPDATE 时发生的查询生命周期内存泄漏
  • 修复 SELECT FOR UPDATE/SHARE 无法正确锁定已被后续中止事务更新的元组(tuples)
  • 修复在启用行级安全(row-level security)的表上,带有列名列表的 COPY 操作
  • 修复 INSERT ... ON CONFLICT 回滚时,删除推测性插入的 TOAST 元组
  • 修复 VACUUM 等待独占表锁以截断表时的时间长度
  • 修复创建或修改表时合并继承的 CHECK 约束中的 bug
  • 修复 jsonb_set() 中数组元素的替换
  • 修复中止使用 btree 索引的缩减键(abbreviated keys)时可能发生的排序错误
  • 在 Windows 上,在“拒绝访问”(access-denied)错误后重试创建动态共享内存控制段
  • 修复 pgbench 的平均延迟计算
  • 使 pg_receivexlog 在没有槽(slots)的情况下正确处理 --synchronous
  • 使 pg_rewind 在源服务器(source server)上关闭其会话中的 synchronous_commit
  • 不要在 libpq 中尝试跨多个连接共享 SSL 上下文
  • 支持 OpenSSL 1.1.0
  • 安装 TAP 测试基础设施,使其可用于扩展测试
  • 修复了逻辑 WAL 解码和复制槽的多个问题
  • 修复了 pg_dump、pg_xlogdump 和 pg_upgrade 中的多个小问题
  • 修复了查询规划器以及 EXPLAIN 输出中的多个小问题
  • 修复了时区支持的多个问题

本次更新还包含 tzdata 2016h 版本,以应对巴勒斯坦和土耳其的夏令时(DST)法律变更,以及土耳其和俄罗斯部分地区的历史数据修正。对南极洲、前苏联和斯里兰卡的一些时区,切换为使用数字缩写。

IANA 时区数据库以前为所有时区提供了文本缩写,有时会使用在当地人群中很少或根本不使用的缩写。他们正在改变这一政策,转向在没有证据表明实际使用英语缩写的地方使用数字 UTC 偏移。至少目前,PostgreSQL 将继续接受这些已移除的缩写用于时间戳输入。但它们不会显示在 pg_timezone_names 视图中,也不会用于输出。

在此次更新中,AMT 不再用于表示亚美尼亚时间(Armenia Time)。因此,我们已更改默认缩写集,将其解释为亚马逊时间(Amazon Time),即 UTC-4 而非 UTC+4。

9.1 版本生命周期结束(EOL)通知

PostgreSQL 9.1 版本现已达到生命周期终点(EOL)。社区将不再发布此版本的任何后续更新或安全补丁。仍在使用 9.1 的用户应尽快升级。有关更多信息,请参阅我们的版本策略(https://postgresql.ac.cn/support/versioning/)。

更新

所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户在应用此更新版本时无需转储和重新加载数据库或使用 pg_upgrade;您只需关闭 PostgreSQL 并更新其二进制文件即可。

如果您的系统受到了大端序 pg_upgrade bug 的影响,请阅读可见性映射问题,并按照说明修复 PostgreSQL 实例上的此问题。

跳过了一个或多个更新版本的用户可能需要执行额外的、更新后的步骤;有关详细信息,请参阅早期版本的发布说明。

链接