前言
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
其他特性
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 快速知晓对应的等待事件信息
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




