PostgreSQL 全球开发组发布了对其所有支持版本数据库系统的更新,包括 9.6.1, 9.5.5, 9.4.10, 9.3.15, 9.2.19 和 9.1.24。这也是 PostgreSQL 9.1 系列的最后一次更新,因为它已达到生命周期终点。本次发布修复了两个可能导致数据损坏的问题,详细信息请见下文。此外,还修补了过去三个月报告的许多其他 bug。项目敦促用户在下次停机时尽快应用此更新。
在此次发布之前,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 系列版本中。
在大端序机器上(例如许多非 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 多个修复,包括:
本次更新还包含 tzdata 2016h 版本,以应对巴勒斯坦和土耳其的夏令时(DST)法律变更,以及土耳其和俄罗斯部分地区的历史数据修正。对南极洲、前苏联和斯里兰卡的一些时区,切换为使用数字缩写。
IANA 时区数据库以前为所有时区提供了文本缩写,有时会使用在当地人群中很少或根本不使用的缩写。他们正在改变这一政策,转向在没有证据表明实际使用英语缩写的地方使用数字 UTC 偏移。至少目前,PostgreSQL 将继续接受这些已移除的缩写用于时间戳输入。但它们不会显示在 pg_timezone_names 视图中,也不会用于输出。
在此次更新中,AMT 不再用于表示亚美尼亚时间(Armenia Time)。因此,我们已更改默认缩写集,将其解释为亚马逊时间(Amazon Time),即 UTC-4 而非 UTC+4。
PostgreSQL 9.1 版本现已达到生命周期终点(EOL)。社区将不再发布此版本的任何后续更新或安全补丁。仍在使用 9.1 的用户应尽快升级。有关更多信息,请参阅我们的版本策略(https://postgresql.ac.cn/support/versioning/)。
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户在应用此更新版本时无需转储和重新加载数据库或使用 pg_upgrade;您只需关闭 PostgreSQL 并更新其二进制文件即可。
如果您的系统受到了大端序 pg_upgrade bug 的影响,请阅读可见性映射问题,并按照说明修复 PostgreSQL 实例上的此问题。
跳过了一个或多个更新版本的用户可能需要执行额外的、更新后的步骤;有关详细信息,请参阅早期版本的发布说明。
链接