跳过正文
  1. PostgreSQL 大法师/

PostgreSQL 17 发布:摊牌了,我不装了!

·7011 字·14 分钟· ·
冯若航
作者
冯若航
Pigsty 创始人, @Vonng
目录

一年一度的 PostgreSQL 大版本发布来了!这次的 PostgreSQL 17 ,又给我们带来了什么惊喜呢?

在这次大版本发布注记中, PostgreSQL 全球社区直接摊牌了 —— 不好意思,我不装了 —— “现在PG就是世界上最先进的开源数据库,已经是各种规模组织的首选开源数据库了”。虽然没有指名道姓,但官方已经无限接近喊出“干翻顶级商业数据库”(Oracle)的口号了。

news.webp

在年初发表的 《PostgreSQL 正在吞噬数据库世界》中,我提出 可扩展性 是 PostgreSQL 独一无二的核心优势。 很高兴地看到这一点在短短半年中,就成为了 PostgreSQL 社区的关注焦点与共识,并在 PGCon.Dev 2024 与本次 PostgreSQL 17 发布中得到充分的体现。

关于新特性,我先前在 《PostgreSQL 17 Beta1 发布!牙膏管挤爆了!》中已经有过介绍,在此就不再赘述了。 这个大版本有很多新特性,当然要说最让我印象深刻的是, PG竟然能在原本就已经非常强悍的性能 基础上让写入吞吐再次翻倍 —— 朴实无华的强悍

但比起具体的功能特性,我认为 PG 社区最大的转变发生在 心态与精神 上 —— 在这次发布通告中,PostgreSQL 去掉了原本 Slogan “世界上最先进的开源关系型数据库” 中的 “关系型” 三个字定语,直接变成了 “世界上最先进的开源数据库”。 并且在最后 “关于PostgreSQL” 的部分说到:“PG 的功能集,高级特性,可扩展性,安全性,稳定性已经比肩甚至超越了顶级商业数据库”。所以我想 “开源” 这个定语用不了多久也许就可以一同去掉,变成 “世界上最先进的数据库” 了。

PostgreSQL 这头巨兽已经觉醒了 —— 它不再是过去那种佛系与世无争的样子,精神面貌焕然一新,转换为一种积极进取的姿态 —— 它已经做好了接管与征服整个数据库世界的心理建设与动员准备。 而无数资本也已经涌入 PostgreSQL 生态,PG 系的 Startup 几乎拿走了数据库领域融资的全部 New Money。PostgreSQL 势必成为数据库领域一统天下的 “Linux 内核,DBMS 的纷争也许在未来会内化为 PostgreSQL 发行版内战,就让我们拭目以待吧。

eco.png


原文:PostgreSQL 17 发布注记
#

PostgreSQL 全球开发组 今天正式(2024-09-26)宣布了 PostgreSQL 17 的正式发布,这是世界上最先进的开源数据库的最新版本。

备注:是的,“关系型”定语已经去掉了,就是世界上最先进的开源数据库

PostgreSQL 17 建立在数十年的开源开发模式基础上,在不断提升性能与可伸缩性的同时,也在不断适应数据访问与存储的新兴模式。 本次 PostgreSQL 发布带来了显著的整体性能提升,例如,VACUUM 内存管理的彻底改进、存储访问优化、高并发工作负载改进、批量加载与导出加速、以及索引查询执行的改进等。 PostgreSQL 17具备能够同时惠及新型工作负载和关键核心系统的特性,例如:新增的 SQL/JSON 的 JSON_TABLE 命令改善了开发者体验;而对逻辑复制的改进,则简化了高可用架构与大版本升级的管理负担。

PostgreSQL 核心团队成员 Jonathan Katz 表示:“PostgreSQL 17 展现了全球开源社区如何协同构建,改善功能,帮助位于数据库旅途中不同阶段的用户”。“无论是针对大规模数据库运维的改进,还是基于卓越开发者体验的新特性,PostgreSQL 17 都将为您带来更好的数据管理体验。”

PostgreSQL 是一款以可靠性、稳健性和可扩展性著称的创新型数据管理系统,受益于全球开发者社区超过 25 年的开源开发,已成为各类组织的首选开源关系型数据库


系统性能的全面提升
#

PostgreSQL 的 vacuum 进程对于系统健康运行至关重要,然而 vacuum 操作是需要消耗服务器实例资源的。PostgreSQL 17 引入了一种新的 vacuum 内部内存结构,内存消耗量降至原本的 1/20。这不仅提高了 vacuum 的速度,还减少了对共享资源的占用,为用户的工作负载释放出更多可用资源。

PostgreSQL 17 也继续在 I/O 层面上不断优化性能。由于对预写日志(WAL)处理的改进,高并发工作负载的 写入吞吐量可能有高达两倍的提升。此外,新的流式 I/O 接口加快了顺序扫描(读取表中所有数据)以及 ANALYZE 更新 Planner 所需统计信息的速度。

PostgreSQL 17 也在查询执行方面改善了性能。对于使用 B-tree 索引(PostgreSQL 默认的索引方法)的 IN 子句查询,性能有所提高。此外,BRIN 索引现在支持并行构建。 PostgreSQL 17 在查询规划方面进行了多项改进,包括对 NOT NULL 约束的优化,以及对 CTE(WITH 查询)处理的改进。本次发布中,使用 SIMD(单指令多数据)加速计算得到了更广泛地应用,例如在 bit_count 函数中使用 AVX-512 指令。


进一步丰富的开发者体验
#

PostgreSQL 是 第一个添加 JSON 支持的关系型数据库(2012年),而 PostgreSQL 17 进一步完善了对 SQL/JSON 标准的实现。JSON_TABLE 特性现已在 PostgreSQL 17 中可用 —— 它允许开发者将 JSON 数据转换为标准的 PostgreSQL 表。 PostgreSQL 17 现在支持 SQL/JSON 标准的 构造函数JSONJSON_SCALARJSON_SERIALIZE)和 查询函数JSON_EXISTSJSON_QUERYJSON_VALUE),为开发者提供了更多种类的与 JSON 数据交互的方式。 本次发布添加了更多种类的 jsonpath 表达式,重点是将 JSON 数据转换为原生的 PostgreSQL 数据类型,包括数值、布尔值、字符串和日期/时间类型。

PostgreSQL 17 为 MERGE (带条件版本的 UPDATE)添加了更多功能,包括 RETURNING 子句,和更新 视图 的能力。 此外,PostgreSQL 17 中批量加载与导出数据的能力得到加强,例如,在使用 COPY 命令导出大量数据时,性能提升高达两倍。当源端和目标编码匹配时,COPY 性能也有所提升,而且 COPY 命令包含一个新选项 ON_ERROR,允许在插入错误时继续导入。

此次发布还扩展了对分区数据和分布在远端 PostgreSQL 实例上的数据的管理功能。PostgreSQL 17 支持在分区表上使用标识列(Identity Columns)和 EXCLUDE 约束。 用于在远程 PostgreSQL 实例上执行查询的 PostgreSQL 外部数据源包装器(postgres_fdw)现在可以将 EXISTSIN 子查询下推到远程服务器,以实现更高效的处理。

PostgreSQL 17 还包含一个内置的、平台无关的、不可变的排序规则提供者,以确保排序规则的不可变性,并提供了类似于 C 排序规则的排序语义,但使用 UTF-8 编码而非 SQL_ASCII。使用这个新的排序规则提供者,可以保证您的文本查询无论在哪里的 PostgreSQL 上运行,都能返回相同的排序结果。


针对高可用与大版本升级的逻辑复制改进
#

在许多用例中,逻辑复制 用于实时传输数据。 然而,在 17 版本之前,想要执行大版本升级的用户必须先删除掉逻辑复制槽,并需要在升级后将数据重新同步到订阅者。 从 PostgreSQL 17 开始,用户不需要先删除逻辑复制槽了,因而简化了使用逻辑复制时的大版本升级过程。

PostgreSQL 17 现在包含了针对逻辑复制的故障切换能力,使其在高可用环境中部署时更为可靠。 此外,PostgreSQL 17 引入了命令行工具 pg_createsubscriber,用于将物理从库转换为一个新的逻辑从库。


更多面向安全与运维的管理选项
#

PostgreSQL 17 进一步扩展了用户对数据库系统全生命周期的管理能力。PostgreSQL 提供了一个新的 TLS 选项 sslnegotiation,允许用户在使用 ALPN(在 ALPN 目录中注册为 postgresql)时执行直接 TLS 握手。 PostgreSQL 17 还添加了 预置角色 pg_maintain,赋予普通用户执行维护操作的权限。

PostgreSQL 自带的备份工具 pg_basebackup 现在支持增量备份,并添加了命令行功能程序 pg_combinebackup 用于重建全量备份。 此外,pg_dump 新增了一个名为 --filter 的选项,允许您在生成转储文件时,选择要包含的对象。

PostgreSQL 17 还增强了监控和分析功能。EXPLAIN 命令现在会显示本地块读写I/O耗时,并包含两个新选项:SERIALIZEMEMORY,可以显示用于网络传输的数据转换耗时以及使用的内存量。 PostgreSQL 17 现在还会报告 索引 VACUUM 的进度, 并添加了新的系统视图 pg_wait_events,在与 pg_stat_activity 视图结合使用时可以更深入地了解活动会话的等待原因。


其他功能
#

PostgreSQL 17 中还添加了许多其他新功能和改进,可能会对您的用例有所帮助。请参阅 发行注记 以查阅新功能和变更的完整列表。


关于 PostgreSQL
#

PostgreSQL 是全世界最先进的开源数据库,拥有着一个由成千上万的用户、贡献者、公司和组织组成的全球社区。它始于加州大学伯克利分校,有着超过 35 年的工程与开发历史。 PostgreSQL 以无与伦比的开发速度持续发展:PostgreSQL 提供成熟的功能集不仅比肩能顶级的专有商业数据库系统,在高级数据库功能、可扩展性、安全性和稳定性方面上甚至超越了它们。

译注:说的就是你呀,Oracle


关于 Pigsty
#

顺带一提,紧随 PostgreSQL 17 发布的 Pigsty v3.0.3 已经正式支持使用 PostgreSQL 17 内核,欢迎试用。

Pigsty 是开源免费,本地优先,开箱即用的 PostgreSQL RDS,允许用户在本地一键拉起生产级的 PG 云数据库服务,并带有开箱即用的 390 个PG扩展插件,故障自愈的高可用,顶级监控系统,PITR备份恢复,IaC命令行工具,SOP管理预案的完整解决方案。

pigsty-home.webp


其他参考阅读
#

德哥在他的博客中已经解读了许多关于 PostgreSQL 17 的新功能特性,是进一步了解 PostgreSQL 17 新功能特性的好资源:

PostgreSQL 17 正式发布, 要不要升?

支持块级别增量备份与恢复:

  • 《PostgreSQL 17 preview - 内置块级别物理增量备份(INCREMENTAL backup/pg_combinebackup)功能》
  • 《PostgreSQL 17 preview - Add new pg_walsummary tool》
  • 《PostgreSQL 17 preview - Add new function pg_get_wal_summarizer_state() 分析为聚合入 pg_wal/summaries 的pid内存中的wal片段信息》
  • 《PostgreSQL 17 preview - 增量备份patch: Add the system identifier to backup manifests》

支持逻辑复制failover、switchover:

  • 《PostgreSQL 17 preview - pg_upgrade大版本升级支持保留逻辑订阅全部信息 (preserve the full subscription’s state)》
  • 《PostgreSQL 17 preview - 主库视图 pg_replication_slots.conflict_reason 支持逻辑复制冲突原因跟踪》
  • 《PostgreSQL 17 preview - 支持逻辑复制槽failover to 流复制standby节点. pg_create_logical_replication_slot(... failover = true|false ...)
  • 《PostgreSQL 17 preview - preparation for replicating unflushed WAL data》
  • 《PostgreSQL 17 preview - sync logical replication slot LSN, Failover & Switchover》
  • 《PostgreSQL 17 preview - Add a new slot sync worker to synchronize logical slots》
  • 《PostgreSQL 17 preview - 增加GUC standby_slot_names , 保证这些standby已接收并flush所有逻辑slot向下游发送逻辑数据对应的WAL》
  • 《PostgreSQL 17 preview - pg_createsubscriber支持将物理从库转换为逻辑从库》
  • 《PostgreSQL 17 preview - 跟踪slot断联时间戳 pg_replication_slots.inactive_since

支持COPY错误处理:

  • 《PostgreSQL 17 preview - Add new COPY option SAVE_ERROR_TO (copy跳过错误行)》
  • 《PostgreSQL 17 preview - pg_stat_progress_copy Add progress reporting of skipped tuples during COPY FROM》
  • 《PostgreSQL 17 preview - COPY LOG_VERBOSITY notice ERROR信息》

JSON类型处理能力增强:

  • 《PostgreSQL 17 preview - Implement various jsonpath methods》
  • 《PostgreSQL 17 preview - JSON_TABLE: Add support for NESTED paths and columns》

vacuum性能改进:

  • 《PostgreSQL 17 preview - 增加index vacuum 进度打印》
  • 《PostgreSQL 17 preview - Optimize vacuuming of relations with no indexes 降低wal产出》
  • 《PostgreSQL 17 preview - 解除vacuumdb,clusterdb,reindexdb的某些options组合限制》
  • 《PostgreSQL 17 preview - 使用TidStore数据结构存储dead tupleids, 提升vacuum效率, 为什么PG单表不建议超过8.9亿条记录?》
  • 《PostgreSQL 17 preview - vacuum_buffer_usage_limit调大默认值, 减少vacuum造成的wal flush, 提升vacuum速度》

index 性能优化:

  • 《PostgreSQL 17 preview - Allow Incremental Sorts on GiST and SP-GiST indexes》
  • 《PostgreSQL 17 preview - btree index backward scan (order by desc 场景)优化》
  • 《PostgreSQL 17 preview - Allow parallel CREATE INDEX for BRIN indexes》

高并发锁竞争优化:

  • 《PostgreSQL 17 preview - 优化wal insert lock, 提升高并发写入吞吐性能》
  • 《PostgreSQL 17 preview - Reduce rate of walwriter wakeups due to async commits》
  • 《PostgreSQL 17 preview - WAL锁竞争优化 - reading WAL buffer contents without a lock, Additional write barrier in AdvanceXLInsertBuffer()》

性能优化:

  • 《PostgreSQL 17 preview - 函数parser阶段优化, 函数guc into lists避免parser》
  • 《PostgreSQL 17 preview - 删除snapshot too old特性, 将引入新实现方式》
  • 《PostgreSQL 17 preview - postgres_fdw 支持semi-join pushdown (exists (…))》
  • 《PostgreSQL 17 preview - 将unstable hashfunc剥离, 提升in-memory场景哈希计算性能和算法自由度》
  • 《PostgreSQL 17 preview - 优化器增强, group by支持Incremental Sort, GUC: enable_group_by_reordering》
  • 《PostgreSQL 17 preview - 引入新的smgr, 优化bulk loading》
  • 《PostgreSQL 17 preview - Add --copy-file-range option to pg_upgrade
  • 《PostgreSQL 17 preview - 减少分区表partitionwise join内存消耗》
  • 《PostgreSQL 17 preview - 使用 Merge Append 提升 UNION 性能》
  • 《PostgreSQL 17 preview - pg_restore --transaction-size=N 支持N个对象封装为一个事务提交》

新增GUC参数:

  • 《PostgreSQL 17 preview - Add GUC: event_triggers . for temporarily disabling event triggers》
  • 《PostgreSQL 17 preview - Allow ALTER SYSTEM to set unrecognized custom GUCs.》
  • 《PostgreSQL 17 preview - XX000 内部错误 backtrace, add GUC backtrace_on_internal_error》
  • 《PostgreSQL 17 preview - allow_alter_system GUC控制 是否允许 alter system 修改 postgresql.auto.conf
  • 《PostgreSQL 17 preview - 新增 GUC: or_to_any_transform_limit 控制 OR to ANY 转换》
  • 《PostgreSQL 17 preview - 新增 GUC trace_connection_negotiation : 跟踪客户端 SSLRequest or GSSENCRequest packet》

SQL语法、函数功能增强:

  • 《PostgreSQL 17 preview - plpgsql 支持定义 %TYPE %ROWTYPE 数组变量类型》
  • 《PostgreSQL 17 preview - 支持修改生成列表达式 alter table ... ALTER COLUMN ... SET EXPRESSION AS (express)
  • 《PostgreSQL 17 preview - Support identity columns in partitioned tables》
  • 《PostgreSQL 17 preview - 简化exclude约束用法, 对primary key,unique约束增加without overlaps可选项》
  • 《PostgreSQL 17 preview - Add RETURNING support to MERGE》
  • 《PostgreSQL 17 preview - 增加uuid功能函数: 提取UUID值里面的时间戳 和 生成UUID值的函数版本》
  • 《PostgreSQL 17 preview - 新增返回某个范围内的随机数的随机函数 random(min, max)
  • 《PostgreSQL 17 preview - Add support for MERGE ... WHEN NOT MATCHED BY SOURCE
  • 《PostgreSQL 17 preview - 使用pg_basetype 获得domain类型的基础类型》
  • 《PostgreSQL 17 preview - Implement ALTER TABLE ... MERGE|SPLIT PARTITION … command》

管理手段增强:

  • 《PostgreSQL 17 preview - 内置支持login event trigger》
  • 《PostgreSQL 17 preview - Add tests for XID wraparound》
  • 《PostgreSQL 17 preview - pgbench工具新增meta语法syncpipeline, pgbench: Add \syncpipeline
  • 《PostgreSQL 17 preview - 引入MAINTAIN权限及pg_maintain预制角色》
  • 《PostgreSQL 17 preview - 新增 “builtin” collation provider》
  • 《PostgreSQL 17 preview - 通过pg_wal_replay_wait()支持读写分离pool实现跨实例的读写一致性》
  • 《PostgreSQL 17 preview - transaction_timeout》

内部统计信息、系统视图增强:

  • 《PostgreSQL 17 preview - Add new parallel message type to progress reporting.》
  • 《PostgreSQL 17 preview - Add system view pg_wait_events》
  • 《PostgreSQL 17 preview - Add JIT deform_counter》
  • 《PostgreSQL 17 preview - 添加checkpoint delay等待事件》
  • 《PostgreSQL 17 preview - Add local_blk_{read|write}_time I/O timing statistics for local blocks》
  • 《PostgreSQL 17 preview - Introduce pg_stat_checkpointer》
  • 《PostgreSQL 17 preview - improve range type pg_stats》
  • 《PostgreSQL 17 preview - 增强standby节点检查点统计信息》
  • 《PostgreSQL 17 preview - Add EXPLAIN (MEMORY) to report planner memory consumption》

table access method 接口增强:

  • 《PostgreSQL 17 preview - Add support for DEFAULT in ALTER TABLE .. SET ACCESS METHOD
  • 《PostgreSQL 17 preview - 支持修改分区表access method》
  • 《PostgreSQL 17 preview - 寻找undo-based table access methods的蛛丝马迹》
  • 《PostgreSQL 17 preview - 频繁提交table access method相关patch, undo-based table access methods真的快来了吗?》
  • 《PostgreSQL 17 preview - table AM增强: Custom reloptions for table AM》

扩展接口能力增强:

  • 《PostgreSQL 17 preview - 增加alter table部分属性hook, 未来可定制化审计功能》
  • 《PostgreSQL 17 preview - 支持自定义等待事件》
  • 《PostgreSQL 17 preview - Introduce the dynamic shared memory registry (DSM 注册器)》
  • 《PostgreSQL 17 preview - 新增代码注入功能(enable-injection-points), 类似hook.》
  • 《PostgreSQL 17 preview - 引入读写原子操作函数接口with full barrier semantics》
  • 《PostgreSQL 17 preview - 支持在申请时指定动态共享内存区域初始、最大段size》
  • 《PostgreSQL 17 preview - 代码注入(injection_points)功能增强, Introduce runtime conditions》

libpq协议增强:

  • 《PostgreSQL 17 preview - libpq: Add support for Close on portals and statements , 释放绑定变量语句入口(prepared statements)》
  • 《PostgreSQL 17 preview - 增加wire protocol头文件》
  • 《PostgreSQL 17 preview - libpq新增 PQchangePassword() 接口, 防止alter user修改密码时明文被记录在SQL活跃会话、log、pg_stat_statements中》

相关文章

PostgreSQL 17 beta1 发布!

·2874 字·6 分钟
PostgreSQL 全球开发组宣布,PostgreSQL 17 的首个 Beta 版本现已开放,这次 PG 真的是把牙膏管给挤爆啦!