PostgreSQL 全球开发组发布了 PostgreSQL 14.4,以修复使用 CREATE INDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-createindex.html) 或 REINDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-reindex.html) 命令时可能导致静默数据损坏的问题。请查看以下部分了解如何检测和修复索引中的静默数据损坏。
本版本还修复了自 2022 年 5 月 PostgreSQL 14.3 发布以来的 15 个以上 Bug。完整的变更列表请查看发布说明 (https://www.postgresql.org/docs/release/)。
此版本仅针对 PostgreSQL 14。PostgreSQL 全球开发组将于 2022 年 8 月 11 日为所有受支持的 PostgreSQL 版本(10 - 14)发布计划内的更新版本。
检测并修复 "CREATE INDEX CONCURRENTLY" / "REINDEX CONCURRENTLY" 导致的损坏
PostgreSQL 14.4 修复了 CREATE INDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-createindex.html) 和 REINDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-reindex.html) 中可能导致索引静默数据损坏的问题。在修复之前,CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 可能会构建缺少条目的索引,导致使用该索引的 SELECT 查询找不到某些行。此问题可能并未损坏您的索引,但如果您不确定,我们建议您使用以下说明进行重建索引。
您可以使用 pg_amcheck (https://www.postgresql.org/docs/current/app-pgamcheck.html) 命令配合 --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 (https://www.postgresql.org/docs/current/app-reindexdb.html) 命令重建整个集群中的所有索引。reindexdb 还有一个 --jobs 标志,允许您并行运行重建索引操作。例如,要使用 <N> 个并行任务重建整个 PostgreSQL 集群的索引,可以运行以下命令:
reindexdb --all --concurrently --jobs <N>
Bug 修复与改进
本次更新修复了过去几个月报告的 15 个以上 Bug。以下列出的问题影响 PostgreSQL 14。
本次发布包含:
对查询计划记忆化的多项修复。
修复了当"全行变量"引用返回复合类型域的函数的结果时的查询问题。
修复了使用引用 GROUPING 函数的子 SELECT 时出现的"variable not found in subplan target list"规划器错误。
修复了当数据库编码为 SQL_ASCII 但客户端编码为多字节编码时 COPY FROM 中的错误检查。
向事件触发器报告隐式创建的操作符族(由 CREATE OPERATOR CLASS 生成)。
防止在逻辑复制大型事务期间在备库上触发 wal_receiver_timeout。
移除 libpq 中不正确的 TLS 私钥文件所有权检查。
防止 pg_amcheck 在服务器连接丢失后崩溃。
完整的变更列表请查看发布说明 (https://www.postgresql.org/docs/release/)。
升级
所有 PostgreSQL 更新版本都是累积性的。与其他小版本更新一样,用户无需转储和重新加载数据库或使用 pg_upgrade 来应用此更新版本;只需关闭 PostgreSQL 并更新其二进制文件即可。
但是,如果您在 PostgreSQL 14 上运行了 CREATE INDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-createindex.html) 或 REINDEX CONCURRENTLY (https://www.postgresql.org/docs/current/sql-reindex.html),则可能需要采取额外步骤。请查看"检测并修复 CREATE INDEX CONCURRENTLY / REINDEX CONCURRENTLY 导致的损坏"部分了解更多详情。
跳过了一个或多个更新版本的用户可能需要执行额外的更新后步骤;详情请参阅早期版本的发布说明。
更多详情请查看发布说明 (https://www.postgresql.org/docs/release/)。
PostgreSQL 10 生命周期终止通知
PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。如果您在生产环境中运行 PostgreSQL 10,建议您制定升级到更新的受支持 PostgreSQL 版本的计划。更多信息请参阅我们的版本策略 (https://www.postgresql.org/support/versioning/)。
相关链接
下载 (https://www.postgresql.org/download/)
发布说明 (https://www.postgresql.org/docs/release/)
安全 (https://www.postgresql.org/support/security/)
版本策略 (https://www.postgresql.org/support/versioning/)
在 Twitter 上关注 @postgresql (https://twitter.com/postgresql)