postgres autovacuum重试机制



在postgres中,当autovacuum运行时,由于某种原因说它能够执行autovacuum -例如当hot_standby_feedback被设置并且有长时间运行的查询在待机时。例如,tab1已经更新,它触发了自动真空,同时,一个长时间运行的备用查询正在运行,并将此信息发送给主服务器,主服务器将跳过tab1上的真空。

由于autovacuum在tab1中被跳过,autovacuum何时再次在表上运行vacuum ?或者它不会再运行自动吸尘了我们需要手动运行吸尘。基本上,autovacuum是否会在第一次无法真空的表上重试autovacuum ?

Autovacuum不会因为hot_standby_feedback而被跳过。它仍然运行,如果没有行可以删除,它可能不会完成任何事情。如果是这种情况,那么pg_stat_all_tables。N_dead_tup没有减少,这意味着在下次评估数据库是否进行自动真空时,该表可能会再次被自动真空,因为使它符合条件的统计数据没有改变。在空闲的系统上,每次扫描表中不完全可见的部分(向上取整到autovacuum_naptime的下一个增量)都会发生一次这种情况。

抑制表的重复自动真空可能是个好主意(尽管用例很窄,我对此表示怀疑),直到水平发展到足以使其值得使用为止,但目前还没有这样做的代码。

请注意,这与INSERT驱动的自动真空不同。在这里,n_ins_since_vacuum确实会被重置,即使没有一个元组被标记为全部可见。因此,在表越过其他阈值使其符合条件之前,该vacuum将不会再次运行。

最新更新