我有'autovacuum_freeze_max_age',默认值为200 000 000。理论上,我发现一个规则,自动真空绕回开始时:
If age(relfrozenxid) > autovacuum_freeze_max_age
但是,通常的自动真空何时启动?我如何计算时间:
1.何时启动检查床上的常规自动真空?
1.自动真空何时变为自动真空绕回?确实是在年龄(relfrozenxid)〉自动真空冻结最大年龄之后?
我有'autovacuum_freeze_max_age',默认值为200 000 000。理论上,我发现一个规则,自动真空绕回开始时:
If age(relfrozenxid) > autovacuum_freeze_max_age
但是,通常的自动真空何时启动?我如何计算时间:
1.何时启动检查床上的常规自动真空?
1.自动真空何时变为自动真空绕回?确实是在年龄(relfrozenxid)〉自动真空冻结最大年龄之后?
2条答案
按热度按时间eivgtgni1#
如文件所述,触发正常自动真空
如果自最后一个
VACUUM
以来废弃的元组的数目超过"真空阈值",则表被清空。其中真空基础阈值是autovacuum_vacuum_threshold,真空比例因子是autovacuum_vacuum_scale_factor,并且元组的数量是
pg_class.reltuples
。如果自上一次清空以来插入的元组数超过了定义的插入阈值,也会清空表,该阈值定义为:
其中真空插入基本阈值是autovacuum_vacuum_insert_threshold,并且真空插入比例因子是autovacuum_vacuum_insert_scale_factor。
第二部分仅适用于PostgreSQL v13及更高版本。
此外,
如果表的
relfrozenxid
值大于旧的vacuum_freeze_table_age
事务,则执行积极的真空以冻结旧元组并推进relfrozenxid
;否则,仅扫描自上次真空以来已修改的页。因此,如果表中有足够旧的行,则由正常机制触发的autovacuum工作线程运行可以作为防绕回
VACUUM
运行。最后,
始终清空
relfrozenxid
值大于autovacuum_freeze_max_age
事务旧值的表因此,如果一个包含旧的活动元组的表在正常处理过程中从未被自动清空,那么即使自动清空被禁用,也会为它触发一个特殊的防绕回自动清空运行。如果存在早于
vacuum_multixact_freeze_table_age
的多事务,也会强制执行这样的自动清空运行,请参阅此处。从PostgreSQL v14开始,如果表中未冻结的行早于vacuum_failsafe_age
,防绕回自动真空将跳过索引清除以进行更快的处理。是的,这很复杂。
ftf50wuq2#
进行查询,显示死循环(简单真空启动时)和真空环绕时: