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

Postgresql大表未触发autovacuum异常分析

IT那活儿 2025-06-23
139

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!



故障背景

某日收到telepg数据库年龄告警,已经超过2亿了。
登录到数据库检查发现表远远达到触发自动autovacuum的条件,但是迟迟未触发,autovacuum_max_work=3,触发因子0.02:


检查思路

2.1 查看 autovacuum 状态
SELECT pid, state, query, age(clock_timestamp(), query_start) AS runtime FROM pg_stat_activity WHERE state = 'active'ANDqueryLIKE'AUTOVACUUM%';
2.2 查看当前正在执行的 VACUUM 操作的信息
SELECT * FROM pg_stat_progress_vacuum;
参数解释:
  • pid
    正在执行 VACUUM 的进程 ID。 
  • datid
    数据库的 OID(对象标识符)。 
  • relid
    正在进行 VACUUM 的表的 OID。 
  • index_relid
    如果是索引的 VACUUM,则显示索引的 OID;否则为 NULL。 
  • phase
    当前 VACUUM 操作的阶段(例如,initializing、scanning heap、cleaning 等)。 
  • heap_tuples_removed
    已删除的堆元组(即 dead tuples)数量。 
  • heap_blks_vacuumed
    已清理的堆块数量。 
  • index_vacuum_count
    已处理的索引页数量。 
  • last_vacuum_time
    上一次执行 VACUUM 的时间。 
  • vacuum_start_time
    当前 VACUUM 操作开始的时间。
2.3 查看表的 autovacuum 活动情况
select n_tup_ins as"inserts", n_tup_upd as"updates", n_tup_del as"deletes", n_live_tup as"live_tuples", n_dead_tup as"dead_tuples"from pg_stat_user_tables where schemaname ='cnsoc'and relname ='tbm_cfs_prop_inst';
2.4 对目标表执行如下两个SQL,查询autovacuum的阈值和当前该表的dead_tuple数量
select
to_number(current_setting('autovacuum_analyze_threshold'),'9999')+to_number(current_setting('autovacuum_analyze_scale_factor'),'99.99')*reltuples as auto_analyze_threshold,
to_number(current_setting('autovacuum_vacuum_threshold'),'9999')+to_number(current_setting('autovacuum_vacuum_scale_factor'),'99.99')*reltuples as auto_vacuum_threshold,
relname,reltuples
from pg_class c
where relname like'%目标表名%';

select * from pg_stat_all_tables where relname = '目标表名';
    经检查发现表的dead_tuple数量超过阈值,但是autovacuum的worke数量较少,导致无法处理所有autovacuum,从而一直积压。


    故障起因及处理

    3.1 原因分析
    autovacuum的阈值和当前该表的dead_tuple数量:
    • 如果dead_tuple远大于阈值,则可能autovacuum的worker数过少,无法处理所有autovacuum,导致积压。
    • 如果阈值过高,可以尝试设置较小的scale_factor,提高autovacuum频率。
    如何避免:
    • 部署数据库年龄告警,及时发现问题;
    • 针对数据库业务及时调整数据库性能参数。
    3.2 处理方式
    1)对大表设置定制的factor参数,提高其autovacuum频率
    altertable table_name set (autovacuum_vacuum_scale_factor=0.002);
    2)修改autovacuum_max_workers数量
    内存充足的话,autovacuum worker可以适当增加。
    autovacuum作用如下:
    1)清理表中的过期死元组 
    2)防止业务表膨胀
    3)更新表的统计信息以供优化器使用 
    4)autovacuum launcher使用stats collector后台进程收集统计信息来确定autovacuum候选列表这是一个非常频繁的操作,脏活、累活都让它给干了

    END


    本文作者:易龙超(上海新炬中北团队)

    本文来源:“IT那活儿”公众号

    文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论