PostgreSQL 全球开发组已发布了对其数据库系统所有支持版本的更新,包括 9.6.2、9.5.6、9.4.11、9.3.16 和 9.2.20。本次发布包含了一些修复,这些修复解决了索引构建和某些预写日志(WAL)重放情况下的数据损坏问题,详情见下文。此外,它还修补了过去三个月内报告的 75 多个其他错误。
用户应计划在下次计划停机时应用此更新。
如果在之前未编入索引的列上调用 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 操作将考虑目录扫描快照。
此外,还有多项修复旨在提高预写日志(WAL)的稳定性,包括:
这些问题存在于 PostgreSQL 的 9.6 系列版本中,也可能存在于 9.2、9.3、9.4 和 9.5 系列中。
此更新还修复了过去几个月报告的许多错误。其中一些问题仅影响 9.6 系列,但许多问题影响所有受支持的版本。本次发布提供了 75 多个修复,包括:
更新时区数据文件至 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;
请注意,使用此方法意味着您将短暂拥有同一索引的两个副本,因此如果磁盘空间是问题,您可能需要采取其他方法。
跳过了一个或多个更新版本的用户可能需要执行额外的、更新后的步骤;有关详细信息,请参阅早期版本的发布说明。
链接