前言
16 已经正式发布有一阵了,17 大版本也在如火如荼开发之中。中午干饭之余,简单瞅了下社区最近的动态,发现 Failover slots 提交了!除此之外,PostgreSQL 17 也还有不少新特性值得说道说道,一睹为快!
Failover slots
逻辑解码一直有个疑难杂症未得到根除:Failover Slot。逻辑解码依赖复制槽,因为复制槽持有着消费者的”消费状态”,因此数据库不会将消费者还没处理的消息清理掉,但是比较遗憾的是,目前复制槽不会被同步到备机上,因此一旦切换,原来的复制槽将不能继续使用。另外备库也不支持逻辑解码 (16 已支持),因此客户端/订阅者也无法在备库创建逻辑复制插槽。
今天看到 failover slot 已经提交了,使得逻辑复制头顶上飘着的小乌云又少了一朵,逻辑复制要支棱起来了!
增量备份
其次 PostgreSQL 17 内置块级别物理增量备份 (INCREMENTAL backup/pg_combinebackup)功能,具体细节可以参照德哥帖子:https://github.com/digoal/blog/blob/master/202312/20231222_01.md,使用 pg_combinebackup 将一个全量备份 + 一个或多个增量备份合并为一个全新的全量备份。
COPY ON_ERROR
17 对 COPY 命令进行了一个优化,类似于 Greenplum,以下引用自陈淼编著的 Greenplum 管理员指南
缺省请款下,如果导入的数据包含错误的记录,在第一条错误记录发生时,整个操作就会失败退出,且不会有任何数据被导入。如果使用了错误记录隔离模式,数据库会跳过包含错误的记录,并将正确的数据记录导入目标表中。错误记录隔离,仅对格式错误的数据有效,违反约束(比如NOT NULL、CHECK和唯一性约束等)的数据仍会导致整个导入失败,不会有任何数据被导入。
在导入数据的时候可以忽略错误继续导入,目前会忽略错误的记录,然后继续导入,同时在 pg_stat_progress_copy 中添加了 tuples_skipped 字段
copy 又可以分为 copy to 和 copy from,如果遇到报错:
- copy to 不会受到影响,已经导出的数据仍然可见,并且占据一定大小
- copy from,数据会变得不可见,仍然占用磁盘空间类似死元组
内存消耗
17 支持使用 EXPLAIN 查看语句在 planner 阶段的内存消耗,以往需要开启 log_planner_stats
Add EXPLAIN (MEMORY) to report planner memory consumption
WAL summarizer process
17 中还添加了一个 WAL summarizer process,顾名思义,会记录一些 WAL 的总览信息,告诉我们在增量备份覆盖该范围的 WAL 记录时,需要复制哪些块,为增量备份提供基础。
事件触发器
Add support event triggers on authenticated login,可以参考:https://www.depesz.com/2023/10/24/waiting-for-postgresql-17-add-support-event-triggers-on-authenticated-login/
1 | =$ CREATE OR REPLACE FUNCTION login_validate() RETURNS event_trigger LANGUAGE plpgsql AS $$ |
pg_stat_progress_vacuum
在 17 中,pg_stat_progress_vacuum 新增了 indexes_total 和 indexes_processed 指标,以往索引的清理往往都是导致清理慢如狗的罪魁祸首,新增这两个字段可以看到大致的索引清理进度。
old_snapshot_threshold
其次移除了old_snapshot_threshold,这个参数是个矛盾综合体,为了解决表膨胀的问题,但是引入了太多太多的问题,社区也意识到了这个问题,比如索引失效、无法 vacuum truncate、CPU 使用率激增等等。
pg_stats
在 17 中在 pg_stats 新增了几个字段,Display length and bounds histograms in pg_stats
- range_length_histogram
- range_empty_frac
- range_bounds_histogram
其他特性
- support for identity columns on partitioned tables added
- BRIN索引支持并行创建
- GIST索引支持增量排序
- SP-GIST索引支持增量排序
- pg_stat_bgwriter 字段做了拆分,分成了 pg_stat_checkpointer 和 pg_stat_bgwriter 两个视图,
- 添加了 backtrace_on_internal_error GUC,顾名思义,打印出堆栈,When enabled (default off), this logs a backtrace anytime elog() or an equivalent ereport() for internal errors is called.
- 添加了 pg_wait_events 视图,可以结合 pg_stat_acitvity 快速知晓对应的等待事件信息
1 | postgres=# SELECT psa.pid, psa.application_name, psa.wait_event, |
小结
17 也是个值得期待的大版本 ~ 推荐阅读 👇🏻
参考
https://pgpedia.info/postgresql-versions/postgresql-17.html
Noriyoshi Shinoda