autovacuum 是 postgresql 里非常重要的一个服务端进程,能够自动地执行,在一定条件下自动地对 dead tuples 进行清理并对表进行分析

autovacuum参数控制 autovacuum 进程是否打开,默认为 "on"

 

根据postgresql.conf相关配置,理解autovacuum会在两种情况下会被触发:

1.表上(update,delte 记录) >= autovacuum_vacuum_scale_factor* reltuples(表上记录数) + autovacuum_vacuum_threshold

 

说明:

清理基本阈值是autovacuum_vacuum_threshold

清理的缩放系数是autovacuum_vacuum_scale_factor

元组的数目是 reltuples 可以从统计收集器里面获取,参考sql如下:

SELECT reltuples from pg_class WHERE relkind = 'r' AND relname = 'test';

 

2.指定表上事务的最大年龄配置参数autovacuum_freeze_max_age,默认为2亿,达到这个阀值将触发 autovacuum进程,从而避免 wraparound。

表上的事务年龄可以通过 pg_class.relfrozenxid查询。
--例如,查询表 test_1 的事务年龄
select relname,age(relfrozenxid) from pg_class where relname='test_1';
 relname |   age    
---------+----------
 test_1  | 14208876
(1 row)

相关参数修改示例:

ALTER TABLE t SET (autovacuum_vacuum_scale_factor = 0);
ALTER TABLE t SET (autovacuum_vacuum_threshold = 10000);

ALTER TABLE products  SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);

 

附:相关参数说明

AUTOVACUUM参数 AUTOVACUUM PARAMETERS

autovacuum

字符型
默认: autovacuum = on                        
Enable autovacuum subprocess?  'on' ,requires track_counts to also be on.
表示是否开起autovacuum。特别的,当需要冻结xid(事务ID)时,尽管此值为off,PG也会进行vacuum。

log_autovacuum_min_duration

数字型
默认: log_autovacuum_min_duration = -1       单位ms
在规定时长内未完成的vacuum予以记录日志
-1表示禁用,0表示所有的,大于0仅记录超过时间的

autovacuum_max_workers

数字型
默认: autovacuum_max_workers = 3
autovacuum最大线程数
CPU核多,并且IO好的情况下,可多点,但是注意16*autovacuum mem,会消耗较多内存,所以内存也要有基础。
重启数据库生效

autovacuum_naptime

数字型
默认: autovacuum_naptime = 1min
time between autovacuum runs
两次vacuum间隔时间

autovacuum_vacuum_threshold

数字型
默认: autovacuum_vacuum_threshold = 50
min number of row updates before vacuum
达到某表DML操作的最小行数则vacuum

autovacuum_analyze_threshold

数字型
默认: autovacuum_analyze_threshold = 50
min number of row updates before analyze
激活自动analyze操作的最小行数,analyze有利于对SQL语句进行更精准的plan(这是由于explain用到的pg_class列reltuples and relpages are not updated on-the-fly)

autovacuum_vacuum_scale_factor

数字型
默认: autovacuum_vacuum_scale_factor = 0.2
fraction of table size before vacuum
表示autovacuum的vacuum操作所需的变更量阈值,当这个表的update/delete的tuple总数大于(pg_class.reltuples*autovacuum_vacuum_scale_factor+autovacuum_vacuum_threshold)时, 触发vacuum操作
建议不要太高频率,否则会因为vacuum产生较多的XLOG

autovacuum_analyze_scale_factor

数字型
默认: autovacuum_analyze_scale_factor = 0.1
fraction of table size before analyze
表示autovacuum的analyze操作所需的变更量阈值,当这个表的INSERT/update/delete的tuple总数大于(pg_class.reltuples*autovacuum_analyze_scale_factor+autovacuum_analyze_threshold)时, 触发analyze操作

autovacuum_freeze_max_age

数字型
默认: autovacuum_freeze_max_age = 200000000
maximum XID age before forced vacuum
某表的pg_class.relfrozenxid的最大值,如果超出此值则重置xid

autovacuum_multixact_freeze_max_age

数字型
默认: autovacuum_multixact_freeze_max_age = 400000000       
maximum multixact age before forced vacuum

autovacuum_vacuum_cost_delay

数字型
默认: autovacuum_vacuum_cost_delay = 20ms    
default vacuum cost delay for autovacuum, in milliseconds
-1意味着使用vacuum_cost_delay
运行一次vacuum的时长,如果超过此值则休眠然后起来接着vacuum(vacuum很好I/O)

autovacuum_vacuum_cost_limit

数字型
默认: autovacuum_vacuum_cost_limit = -1  default vacuum cost limit for autovacuum
-1意味着使用vacuum_cost_delay

autovacuum_vacuum_cost_delay

数字型
默认: autovacuum_vacuum_cost_delay = 20ms   
default vacuum cost delay for autovacuum, in milliseconds; -1 means use vacuum_cost_delay
当autovacuum进程即将执行时,对vacuum执行cost进行评估,如果超过autovacuum_vacuum_cost_limit的值时,则延迟,这个延迟的时间值即为改成的值.

autovacuum_vacuum_cost_limit

数字型
默认: autovacuum_vacuum_cost_limit = -1     
default vacuum cost limit for autovacuum, -1 means use vacuum_cost_limit
autovacuum进程的评估阀值,-1表示使用vacuum_cost_limit值,如果在执行 autovacuum进程期间评估的cost超过autovacuum_vacuum_cost_limit,则autovacuum进程则会休眠

参考文献:

https://www.postgresql.org/docs/9.6/runtime-config-autovacuum.html