ITPub博客

首页 > 数据库 > 数据库开发技术 > PostgreSQL 17 新特性前瞻

PostgreSQL 17 新特性前瞻

原创 数据库开发技术 作者:u_a9af4a561c3b 时间:2024-01-31 13:15:23 0 删除 编辑

前言

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,数据会变得不可见,仍然占用磁盘空间类似死元组

内存消耗

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


原文作者:PostgreSQL学徒;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-07-14

  • 博文量
    306
  • 访问量
    139291