You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pglogical从Postgres 9.6升级至14后autovacuum未运行问题咨询

问题分析与解答

现象是否为预期行为?

是,这种现象在使用pglogical逻辑复制升级后的PostgreSQL 14主库中属于预期行为,核心原因如下:

1. pglogical逻辑复制的特性直接处理死元组

pglogical基于PostgreSQL逻辑解码机制实现数据同步,当PostgreSQL 14作为pglogical的订阅端接收9.6版本的数据时,同步过程中产生的死元组会被pglogical的专用清理进程直接处理,不会留存下来积累到触发autovacuum的阈值。这就是n_dead_tup始终接近0且无变化的根本原因。

2. autovacuum触发条件未被满足

PostgreSQL的autovacuum启动需要满足明确阈值:

  • 表内死元组数量达到 autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor × 表总行数
  • 或自上次vacuum/analyze后,表的修改次数达到 autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × 表总行数

由于当前PG14库中死元组无积累,且手动执行过VACUUM ANALYZE更新了统计信息,autovacuum的触发条件从未达成,因此不会产生autovacuum活动记录。

3. 流式复制不影响autovacuum逻辑

PG14作为主库向另一台PG14做流式物理复制,这一行为不会阻碍autovacuum运行,只是会同步autovacuum产生的WAL日志。当前场景下无autovacuum活动,完全是因为没有触发需求,和流式复制无关。

验证autovacuum功能正常性的方法

若要确认PG14的autovacuum功能本身无故障,可手动制造死元组进行测试:

-- 创建测试表
CREATE TABLE test_autovacuum (id INT, name TEXT);
-- 批量插入数据
INSERT INTO test_autovacuum SELECT generate_series(1,10000), 'test_data';
-- 制造死元组
UPDATE test_autovacuum SET name = 'updated' WHERE id <= 5000;
DELETE FROM test_autovacuum WHERE id > 5000;

等待10-15分钟后,执行以下命令查看状态:

SELECT relname, last_autovacuum, n_dead_tup FROM pg_stat_user_tables WHERE relname = 'test_autovacuum';

若last_autovacuum字段出现时间戳,说明autovacuum功能正常,仅当前业务场景无需触发。

内容的提问来源于stack exchange,提问作者Mark Fletcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:15:42