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

PostgreSQL 14.4 发布!

发布日期:2022-06-16,作者:PostgreSQL 全球开发组
PostgreSQL 项目

PostgreSQL 全球开发组发布了 PostgreSQL 14.4,以修复在使用 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY 命令时可能导致数据静默损坏的问题。请参阅以下部分,了解如何检测和纠正索引中的数据静默损坏。

此次发布还修复了自 5 月份 PostgreSQL 14.3 发布以来超过 15 个 bug。有关更改的完整列表,请参阅发布说明

本次发布仅针对 PostgreSQL 14。PostgreSQL 全球开发组将于 2022 年 8 月 11 日为所有支持的 PostgreSQL 版本(10 - 14)发布计划更新。

检测和修复“CREATE INDEX CONCURRENTLY”/“REINDEX CONCURRENTLY”引起的损坏

PostgreSQL 14.4 修复了 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY 中可能导致索引数据静默损坏的问题。在此修复之前,CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY 可能会构建出缺少条目的索引,导致使用该索引的 SELECT 查询无法找到某些行。此问题可能尚未损坏您的索引,但如果您不确定,我们建议您按照以下说明进行重新索引。

您可以使用 pg_amcheck 命令配合 --heapallindexed 标志来检测 B-tree 索引(默认索引类型)是否损坏。例如:

pg_amcheck --heapallindexed database

如果 pg_amcheck 检测到损坏,或者您在其他任何索引类型(例如 GiST、GIN 等)上运行了 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY,请按照以下说明进行操作。

一旦您将系统升级到 PostgreSQL 14.4,您就可以使用 REINDEX CONCURRENTLY 来修复任何数据静默损坏。例如,如果您有一个名为 elephant_idx 的索引损坏了,您可以在 PostgreSQL 14.4 上运行以下命令进行修复:

REINDEX CONCURRENTLY elephant_idx;

您可以使用 reindexdb 命令来重新索引整个集群的所有索引。reindexdb 还有一个 --jobs 标志,允许您并行执行重新索引操作。例如,要使用 <N> 个并行作业重新索引整个 PostgreSQL 集群,您可以运行以下命令:

reindexdb --all --concurrently --jobs <N>

错误修复和改进

此更新修复了过去几个月报告的 15 个以上 bug。以下列出的问题会影响 PostgreSQL 14。

包含在此发布版本中

  • 对查询计划记忆化进行了多项修复。
  • 修复了“全行变量”引用返回复合类型域的函数结果的查询。
  • 使用 GROUPING 函数引用的子 SELECT 时,修复了“子计划目标列表中的变量未找到”的规划器错误。
  • 当数据库编码为 SQL_ASCII 但客户端编码为多字节编码时,修复了 COPY FROM 中的错误检查。
  • 将隐式创建的操作符族(由 CREATE OPERATOR CLASS 生成)报告给事件触发器。
  • 防止在逻辑复制大事务期间在备用服务器上触发 wal_receiver_timeout
  • 移除了 libpq 中不正确的 TLS 私钥文件所有权检查。
  • 防止在 pg_amcheck 中服务器连接丢失后崩溃。

有关所有更改的完整列表,请参阅 发布说明

更新

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

但是,如果您在 PostgreSQL 14 上运行了 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY,您可能需要采取额外的步骤。请参阅“检测和修复 CREATE INDEX CONCURRENTLY / REINDEX CONCURRENTLY 损坏”部分了解更多详情。

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

有关更多详细信息,请参阅 发行说明

PostgreSQL 10 EOL(停止支持)通知

PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。如果您在生产环境中使用 PostgreSQL 10,我们建议您计划升级到更新的、受支持的 PostgreSQL 版本。请参阅我们的版本策略了解更多信息。

链接