PostgreSQL Field Guide

PostgreSQL 17:新特性与升级注意点

PostgreSQL 17(2024-09 GA)核心变化 —— 流式 I/O、failover 复制槽、pg_createsubscriber、MERGE RETURNING、JSON_TABLE、增量备份,附升级注意点

PostgreSQL 17 于 2024-09-26 正式发布(GA),支持至 2029-11-08。截至本页核对日,当前 minor 为 17.10;实时支持状态见 版本与支持策略。以下所有特性声明均已对照 PostgreSQL 17 官方 release notes 核实。

流式 I/O(streaming I/O)框架

PostgreSQL 17 为顺序读引入了流式 I/O 接口:执行器不再逐块发出读请求,而是让一串读请求保持在线,顺序扫描等批量读的性能因此改善。PostgreSQL 18 的异步 I/O 子系统正是建立在这套框架之上,17 的这部分工作是 18 更大 I/O 收益的前置基础。

逻辑复制:failover 复制槽与 pg_createsubscriber

  • 复制槽可以跨 failover 存活。 复制协议新增了 failover 属性,配合 sync_replication_slots 让备库同步启用了 failover 的逻辑复制槽;发布端切换到备库后,逻辑订阅者可以继续流式接收。
  • pg_createsubscriber 把物理备库转换为逻辑副本。这是把流复制副本转成逻辑订阅者的标准工具,也是低停机大版本迁移的一条实用路径。

MERGE:WHEN NOT MATCHED BY SOURCE 与 RETURNING

PostgreSQL 17 为 MERGE 增加了 WHEN NOT MATCHED BY SOURCE 动作和 RETURNING 子句(含 merge_action() 函数,可报告每一行实际执行的 DML 动作):

MERGE INTO target USING source ON source.id = target.id
WHEN MATCHED AND target.deleted = false THEN
  UPDATE SET ...
WHEN NOT MATCHED THEN
  INSERT ...
WHEN NOT MATCHED BY SOURCE THEN
  DELETE
RETURNING merge_action(), *;

这两项加在一起,让 MERGE 从仅能 upsert 变成可以承担完整同步任务的语句。

JSON_TABLE

PostgreSQL 17 增加了 SQL 标准的 JSON_TABLE() 函数,把 JSON 数据投影为关系行集:

SELECT * FROM JSON_TABLE(jsonb_col, '$.items[*]' COLUMNS (
  id bigint PATH '$.id',
  name text PATH '$.name'
)) AS t;

当 JSON 文档需要按行做连接、过滤或聚合时,它可以替代一类手写的 jsonb_to_recordset 与 lateral 展开查询。

pg_basebackup 增量备份

PostgreSQL 17 增加了文件系统级增量备份:pg_basebackup --incremental 只生成相对上一份备份清单(manifest)发生变化的块,pg_combinebackup 负责把全量加增量链合成为完整备份:

pg_basebackup --incremental=/path/to/backup_manifest -D ./backup_inc

对大型数据库,这能缩短备份窗口并减少备份存储,代价是恢复时多一步合成。

可配置的 SLRU 缓冲池

子事务、提交时间戳等子系统背后的 SLRU 缓存现在可以通过 subtransaction_bufferscommit_timestamp_buffers 等参数独立调整,且默认随 shared_buffers 缩放。此前这些缓存大小固定,在高并发下可能成为竞争点。

PostgreSQL 17 的其他变化

  • COPY ... ON_ERROR ignore:跳过格式错误的输入行,而不是让整个 copy 中止。(PostgreSQL 18 随后又增加了 REJECT_LIMIT,用于限制可丢弃的行数。)
  • PostgreSQL 17 移除了 old_snapshot_threshold 设置、adminpack contrib 扩展等若干长期弃用的部分——如果从很老的大版本跨级升级,请核对 release notes。

升级到 PostgreSQL 17 的注意点

  • 大版本升级需要 pg_upgrade、dump/restore 或逻辑复制;数据目录不跨大版本兼容。上文提到的 pg_createsubscriber 是本版本引入的逻辑复制迁移路径。
  • 跨越的每一个大版本的 release notes 都要读,不能只读目标版本的。
  • 监控查询可能需要更新:PostgreSQL 17 重命名了若干 pg_stat_statements 计时列(例如 blk_read_time 改为 shared_blk_read_time),并从 pg_stat_bgwriter 移除了 buffers_backend / buffers_backend_fsync 列(与 pg_stat_io 重复)。
  • 每个扩展的 PostgreSQL 17 支持情况要单独确认;扩展有独立的版本号与升级脚本。

锁定 minor,演练 major

生产环境应运行当前的 17.x minor;任何大版本升级都应先在真实数据的恢复副本上演练,再排期切换。通用升级清单见 版本与支持策略

版本路径

来源

Last updated on

On this page