PostgreSQL autovacuum执行被跳过后是否会自动重试
核心结论
该场景下被跳过清理的表不需要手动执行VACUUM,autovacuum内置了完整的自动重试机制,不会因为单次执行被阻挡就永久跳过对该表的自动清理。
重试触发规则
- autovacuum的调度进程(launcher)会按照
autovacuum_naptime参数配置的间隔(默认1分钟)轮询所有库的表统计信息,重新校验每张表是否满足自动清理触发阈值。 - 只要被跳过的表内死元组数量仍然满足
autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * 表现存活元组总数的触发条件,下一轮轮询时就会被重新调度autovacuum工作进程(worker)执行清理。 - 重试时如果此前阻挡清理的备库长查询已经结束,主库收到的备库反馈最小事务ID(xmin)已经推进到可以安全清理死元组的位置,本次清理就会正常执行完成;如果备库长查询仍在运行、清理条件仍不满足,worker会再次跳过该表的清理操作,等待下一轮调度重试,不会将该表加入永久跳过名单。
特殊边界情况
如果备库长查询持续时间过长,表内最老事务ID年龄逼近autovacuum_freeze_max_age配置的阈值(默认2亿),为了避免事务ID回卷导致数据库不可用,autovacuum会强制执行冻结清理,无视hot_standby_feedback的阻挡,此时备库上运行的长查询如果需要访问被清理掉的旧版本元组,会直接报错中断。
内容的提问来源于stack exchange,提问作者nmakb
相关产品推荐
相关产品推荐

