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。此版本包括修复程序,可防止索引构建和某些预写日志重放情况下的数据损坏问题,详情如下。它还修补了过去三个月报告的 75 多个其他错误。

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

使用 CREATE INDEX CONCURRENTLY 构建时的损坏

如果对以前未索引的列调用 CREATE INDEX CONCURRENTLY,则存在竞争条件,那么与 CREATE INDEX CONCURRENTLY 命令同时运行的事务更新的行可能已被错误地索引。

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

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

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

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

在此版本之前,当用于目录扫描的特殊快照可用时,数据可能会被 vacuum 操作过早地修剪。具体来说,vacuum 操作将不知道此特殊快照的最旧 xmin。错误将显示一条消息,例如

"cache lookup failed for relation 1255"

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

此外,还有一些修复程序可以提高预写日志记录的稳定性,包括

  • BRIN 索引 WAL 日志记录的修复,其中重放可能会使 BRIN 索引的一部分无用并需要重新计算
  • 对未记录表的修复,其中在“wal_level = minimal”设置下会创建 WAL 日志,并且在崩溃后重放时,表似乎没有正确重置
  • WAL 页面头验证中的修复,当重新读取段时修复了“out-of-sequence TLI”错误,该错误可能会在恢复期间报告

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

错误修复和改进

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

  • 对在热备模式下运行的几个修复
  • 不允许在 synchronous_standby_names 中将 num_sync 字段设置为零
  • 不要将后台工作进程计入用户的连接限制
  • 修复检查何时可以删除扩展成员对象
  • 修复扩展成员对象的初始权限跟踪,以便它与 ALTER EXTENSION ... ADD/DROP 正确配合使用
  • 几个 vacuum 和 autovacuum 修复
  • 修复 CREATE OR REPLACE VIEW 以在尝试应用新的视图选项之前更新视图查询
  • 确保 ALTER TABLE 在重建索引时保留索引表空间分配
  • 对查询计划器的几个修复,包括对外部表和 CTE 的修复
  • 围绕全文搜索功能的几个修复,以提高搜索的准确性和性能
  • 几个数组函数中的几个修复和性能改进
  • 围绕外键约束与特定 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 模块的几个修复
  • 允许在 ~/.pgpass 文件中使用 DOS 样式行尾,即使在 Unix 上也是如此

将时区数据文件更新为 tzdata 版本 2016j,以适应北塞浦路斯(添加新时区 Asia/Famagusta)、俄罗斯(添加新时区 Europe/Saratov)、汤加和南极洲/凯西的 DST 法律变更。意大利、哈萨克斯坦、马耳他和巴勒斯坦的历史修正。切换为首选汤加的数字时区缩写。

更新

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

如果您认为您已受到上述 CREATE INDEX CONCURRENTLY 错误的影响,则必须重建索引。以下是如何在不失去使用索引能力的情况下在生产系统中重建索引的示例

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;

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

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

链接