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

PostgreSQL 9.6.2、9.5.6、9.4.11、9.3.16 和 9.2.20 已发布!

发布于 2017-02-09,作者 PostgreSQL 全球开发组

PostgreSQL 全球开发组已发布了对其数据库系统所有支持版本的更新,包括 9.6.2、9.5.6、9.4.11、9.3.16 和 9.2.20。本次发布包含了一些修复,这些修复解决了索引构建和某些预写日志(WAL)重放情况下的数据损坏问题,详情见下文。此外,它还修补了过去三个月内报告的 75 多个其他错误。

用户应计划在下次计划停机时应用此更新。

CREATE INDEX CONCURRENTLY 时的构建损坏

如果在之前未编入索引的列上调用 CREATE INDEX CONCURRENTLY,并且在该命令运行时有事务更新了行,则可能存在竞态条件,导致这些行被错误地编入索引。

如果您怀疑可能发生这种情况,最可靠的解决方案是在安装此更新后重建受影响的索引。

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

可见性和预写日志(WAL)稳定性的修复

本次发布包含多项修复,以提高可见数据和 WAL 日志记录的稳定性,我们在此重点介绍。

在此版本之前,当用于目录扫描的特殊快照可用时,vacuum 操作可能会过早地清除数据。具体来说,vacuum 操作不会意识到此特殊快照的最早 xmin。错误会以类似以下消息的方式出现:

"cache lookup failed for relation 1255"

此版本确保 vacuum 操作将考虑目录扫描快照。

此外,还有多项修复旨在提高预写日志(WAL)的稳定性,包括:

  • 修复了 BRIN 索引 WAL 日志记录,该问题可能导致 BRIN 索引的一部分失效,需要重新计算。
  • 修复了在“wal_level = minimal”设置下为未记录表(unlogged table)创建 WAL 日志,并在崩溃后重放时,该表未正确重置的问题。
  • 在 WAL 页头验证中修复了重读日志段时发生的“Tli 序列不正确”错误,该错误可能在恢复期间报告。

这些问题存在于 PostgreSQL 的 9.6 系列版本中,也可能存在于 9.2、9.3、9.4 和 9.5 系列中。

错误修复和改进

此更新还修复了过去几个月报告的许多错误。其中一些问题仅影响 9.6 系列,但许多问题影响所有受支持的版本。本次发布提供了 75 多个修复,包括:

  • 修复了在热备(hot standby)模式下运行的多个问题。
  • 不允许在 synchronous_standby_names 中将 num_sync 字段设置为零。
  • 不要将后台工作进程计入用户连接限制。
  • 修复了检查扩展成员对象是否可以被删除的问题。
  • 修复了扩展成员对象的初始权限跟踪,使其与 ALTER EXTENSION ... ADD/DROP 正常工作。
  • 修复了多个 vacuum 和 autovacuum 问题。
  • 修复了 CREATE OR REPLACE VIEW,在尝试应用新的视图选项之前更新视图查询。
  • 确保 ALTER TABLE 在重建索引时保留索引表空间分配。
  • 修复了查询规划器中的多个问题,包括对外部表(foreign tables)和公共表表达式(CTEs)的修复。
  • 修复了全文搜索(full-text search)功能的多个问题,以提高搜索的准确性和性能。
  • 修复了多个数组函数中的多个问题和性能改进。
  • 修复了外键约束与触发器函数在特定 ALTER TABLE 操作下的多个交互问题。
  • 移除了对日期/时间数据类型不返回正确数据的优化。
  • 修复了将视图 reloptions 错误地用作普通表 reloptions 的问题。
  • 当使用 ON CONFLICT 处理宽表时,修复了“目标列表最多可包含 N 个条目”的错误抱怨。
  • 修复了在具有已删除列的表上进行 INSERT 或 UPDATE 时出现的虚假的“查询为已删除列提供了值”错误。
  • 防止在 UPDATE 源表达式中多列展开 foo.*。
  • 确保为多行 VALUES 结构准确确定列的 typmods。
  • 修复了 psql 命令行工具的多个问题。
  • 防止 pg_start_backup() 和 pg_stop_backup() 并发运行多次。
  • 修复了 pg_dump、pg_restore 和 pg_basebackup 的多个问题,包括在包含 WAL 文件时,pg_basebackup 在备用服务器上可能发生的失败。
  • 修复了并行工作进程和并行查询计划的多个问题,包括修复了并行查询在重扫描期间可用工作进程数量减少时可能发生的崩溃。
  • 修复了 PL/pgSQL、PL/Python 和 PL/Tcl 的多个问题。
  • 修复了 contrib 模块的多个问题。
  • 允许在 Unix 系统上使用 DOS 风格的行尾符(\r\n)作为 ~/.pgpass 文件中的行分隔符。

更新时区数据文件至 tzdata release 2016j,以处理北塞浦路斯(新增时区 Asia/Famagusta)、俄罗斯(新增时区 Europe/Saratov)、汤加和南极洲/凯西的夏令时(DST)法律变更。对意大利、哈萨克斯坦、马耳他、巴勒斯坦进行了历史性修正。汤加切换为优先使用数字时区缩写。

更新

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

如果您认为您受到了上述 CREATE INDEX CONCURRENTLY 错误的 PGD 影响,您将需要重建索引。以下是一个示例,展示了如何在生产系统中重建索引,同时不影响索引的使用能力:

CREATE INDEX CONCURRENTLY new_index_name ON table_name (column_name);
DROP INDEX CONCURRENTLY old_index_name;
ALTER INDEX new_index_name RENAME TO old_index_name;

请注意,使用此方法意味着您将短暂拥有同一索引的两个副本,因此如果磁盘空间是问题,您可能需要采取其他方法。

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

链接