暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PostgreSQL 17新特性前瞻

原创 xiongcc 2024-01-31
1292

前言

16 已经正式发布有一阵了,17 大版本也在如火如荼开发之中。中午干饭之余,简单瞅了下社区最近的动态,发现 Failover slots 提交了!除此之外,PostgreSQL 17 也还有不少新特性值得说道说道,让我们一睹为快!

Failover slots

逻辑解码一直有个疑难杂症未得到根除:Failover Slot。逻辑解码依赖复制槽,因为复制槽持有着消费者的"消费状态",因此数据库不会将消费者还没处理的消息清理掉,但是比较遗憾的是,目前复制槽不会被同步到备机上,因此一旦切换,原来的复制槽将不能继续使用。另外备库也不支持逻辑解码 (16 已支持),因此客户端/订阅者也无法在备库创建逻辑复制插槽。

今天看到 failover slot 已经提交了,使得逻辑复制头顶上飘着的小乌云又少了一朵,逻辑复制要支棱起来了!给大佬们打 call。

图片

图片

增量备份

其次 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,数据会变得不可见,仍然占用磁盘空间类似死元组
图片
Noriyoshi Shinoda (@nori_shinoda) / X

内存消耗

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/

=$ 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 快速知晓对应的等待事件信息
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 也是个值得期待的大版本 ~

参考

git.postgresql.org

Noriyoshi Shinoda

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论