在postgres中,当自动真空运行时,由于某种原因,它可以执行自动真空--例如,当设置了hot_standby_feedback时,在备用状态下有长时间运行的查询。例如,tab1已经更新,它触发了自动真空,同时在备用状态下运行一个长时间运行的查询,并将此信息发送到主服务器,这将跳过tab1上的真空。
自从自动吸尘器被跳过tab1,什么时候自动真空又在桌子上运行?否则,它将不会再次运行自动真空,我们将需要手动运行真空在那个桌子上。基本上,自动真空是否会重新尝试第一次不能真空的桌子上的自动吸尘器?
发布于 2022-07-09 22:34:53
由于hot_standby_feedback,自动真空不会被跳过。它仍然在运行,如果不能删除任何行,它可能无法完成任何任务。如果是这样的话,那么pg_stat_all_tables.n_dead_tup就不会减少,这意味着下一次数据库被评估为自动空分时,该表可能会再次自动空出,因为使它符合条件的状态没有改变。在空闲的系统上,这种情况每隔一次就会发生一次,不管扫描表中不可见的部分需要多长时间,然后再加到autovacuum_naptime的下一个增量。
这可能是个好主意(虽然用例范围很窄,我对此表示怀疑),可以抑制表的重复自动空分,直到地平线已经深入到值得这样做为止,但目前还没有这样做的代码。
请注意,这与插入驱动的自空空间不同。在那里,n_ins_since_vacuum确实会被重置,即使没有一个元组被标记为所有可见的。这样,真空将不会再次运行,直到桌子越过其他门槛,以使它符合条件。
https://stackoverflow.com/questions/72924664
复制相似问题