PostgreSQL学徒

PostgreSQL 17 新特性前瞻

Word count: 1.2kReading time: 5 min
2024/01/31
loading

前言

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
=$ CREATE OR REPLACE FUNCTION login_validate() RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
BEGIN
IF session_user <> 'depesz' THEN
raise exception 'Go AWAY';
END IF;
raise log 'user login: %', session_user;
END;
$$;

=$ CREATE EVENT TRIGGER login_validate
ON login
EXECUTE FUNCTION login_validate();

=$ psql -U test -d depesz -X -c 'select now()'
psql: error: connection TO server ON socket "/tmp/.s.PGSQL.5430" failed: FATAL: GO away
CONTEXT: PL/pgSQL FUNCTION login_validate() line 5 at RAISE

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

其他特性

  1. support for identity columns on partitioned tables added
  2. BRIN索引支持并行创建
  3. GIST索引支持增量排序
  4. SP-GIST索引支持增量排序
  5. pg_stat_bgwriter 字段做了拆分,分成了 pg_stat_checkpointer 和 pg_stat_bgwriter 两个视图,
  6. 添加了 backtrace_on_internal_error GUC,顾名思义,打印出堆栈,When enabled (default off), this logs a backtrace anytime elog() or an equivalent ereport() for internal errors is called.
  7. 添加了 pg_wait_events 视图,可以结合 pg_stat_acitvity 快速知晓对应的等待事件信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
postgres=# SELECT psa.pid, psa.application_name, psa.wait_event,
we.description
FROM pg_stat_activity psa
JOIN pg_wait_events we
ON (psa.wait_event_type = we.type AND
psa.wait_event = we.name);
pid | application_name | wait_event | description
-------+------------------+---------------------+--------------------------------------------------------------
16252 | | AutoVacuumMain | Waiting in main loop of autovacuum launcher process
16249 | | BgWriterMain | Waiting in main loop of background writer process
16248 | | CheckpointerMain | Waiting in main loop of checkpointer process
16253 | | LogicalLauncherMain | Waiting in main loop of logical replication launcher process
16251 | | WalWriterMain | Waiting in main loop of WAL writer process
(5 rows)

小结

17 也是个值得期待的大版本 ~ 推荐阅读 👇🏻

参考

https://pgpedia.info/postgresql-versions/postgresql-17.html

Noriyoshi Shinoda

https://www.depesz.com/2023/10/24/waiting-for-postgresql-17-add-support-event-triggers-on-authenticated-login/

CATALOG
  1. 1. 前言
  2. 2. Failover slots
  3. 3. 增量备份
  4. 4. COPY ON_ERROR
  5. 5. 内存消耗
  6. 6. WAL summarizer process
  7. 7. 事件触发器
  8. 8. pg_stat_progress_vacuum
  9. 9. old_snapshot_threshold
  10. 10. pg_stats
  11. 11. 其他特性
  12. 12. 小结
  13. 13. 参考