PostgreSQL 全球开发组发布了 PostgreSQL 14.4,以修复在使用 CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 命令时可能导致数据静默损坏的问题。请参阅以下部分,了解如何检测和纠正索引中的数据静默损坏。
此次发布还修复了自 5 月份 PostgreSQL 14.3 发布以来超过 15 个 bug。有关更改的完整列表,请参阅发布说明。
本次发布仅针对 PostgreSQL 14。PostgreSQL 全球开发组将于 2022 年 8 月 11 日为所有支持的 PostgreSQL 版本(10 - 14)发布计划更新。
PostgreSQL 14.4 修复了 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 中可能导致索引数据静默损坏的问题。在此修复之前,CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 可能会构建出缺少条目的索引,导致使用该索引的 SELECT 查询无法找到某些行。此问题可能尚未损坏您的索引,但如果您不确定,我们建议您按照以下说明进行重新索引。
您可以使用 pg_amcheck 命令配合 --heapallindexed 标志来检测 B-tree 索引(默认索引类型)是否损坏。例如:
pg_amcheck --heapallindexed database
如果 pg_amcheck 检测到损坏,或者您在其他任何索引类型(例如 GiST、GIN 等)上运行了 CREATE INDEX CONCURRENTLY 或 REINDEX 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。pg_amcheck 中服务器连接丢失后崩溃。有关所有更改的完整列表,请参阅 发布说明。
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户不需要转储和重新加载数据库或使用 pg_upgrade 来应用此更新版本;您可以直接关闭 PostgreSQL 并更新其二进制文件。
但是,如果您在 PostgreSQL 14 上运行了 CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY,您可能需要采取额外的步骤。请参阅“检测和修复 CREATE INDEX CONCURRENTLY / REINDEX CONCURRENTLY 损坏”部分了解更多详情。
跳过了一个或多个更新版本的用户可能需要执行额外的、更新后的步骤;有关详细信息,请参阅早期版本的发布说明。
有关更多详细信息,请参阅 发行说明。
PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。如果您在生产环境中使用 PostgreSQL 10,我们建议您计划升级到更新的、受支持的 PostgreSQL 版本。请参阅我们的版本策略了解更多信息。