postgresql.conf 参数设置之 autovacuum 篇

1,512 阅读3分钟

小知识,大挑战!本文正在参与“   程序员必备小知识   ”创作活动
本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金
参考了阿里云最佳实践,和 postgresql 官方手册,研究学习设置 postgresql.conf 参数。(下列只列出需要修改的参数,默认值即为合适值的没有列出。)

autovacuum 相关设置

autovacuum = on                                          
old_snapshot_threshold = 6h            
log_autovacuum_min_duration = 0     
autovacuum_max_workers = 8              
autovacuum_vacuum_scale_factor = 0.02   
autovacuum_analyze_scale_factor = 0.01  
autovacuum_freeze_max_age = 1200000000  
autovacuum_multixact_freeze_max_age = 1250000000       
autovacuum_vacuum_cost_delay = 0ms  

autovacuum:控制服务器是否运行自动清理启动器后台进程。默认为开启,不过要自动清理正常工作还需要启用 track_counts(默认启用)。 该参数只能在postgresql.conf文件或服务器命令行中设置,通过更改表存储参数可以为表禁用自动清理。 注意即使该参数被禁用,系统也会在需要防止事务ID回卷时发起清理进程。
old_snapshot_threshold:设置可以使用查询快照的最小时间,以规避使用快照时出现“snapshot too old” 错误的风险,超过此阈值时间的数据将可以被清除,这可以有助于阻止长时间使用的快照造成的快照膨胀,默认值为 -1(禁用此功能),实际上将快照的时限设置为无穷大。
log_autovacuum_min_duration:超过这个时间阀值的自动清理动作都会被日志记录,将该参数设置为0会记录所有的自动清理动作,默认值为 -1 (禁用对自动清理动作的记录)。 此外,当该参数被设置为除-1外的任何值时, 如果一个自动清理动作由于一个锁冲突或者被并发删除的关系而被跳过,将会为此记录一个消息。 开启这个参数对于追踪自动清理活动非常有用,但是可以通过更改表的存储 参数为个别表覆盖这个设置。
autovacuum_max_workers:设置能同时运行的自动清理进程(除了自动清理启动器之外)的最大数量,默认值为3。
autovacuum_vacuum_scale_factor:触发 vacuum 自动清理操作的 dml 比例,默认值 0.2,当表上的 dml 操作占据表数据量的 20% 时触发 vacuum 自动清理操作,为防止数据量较小的表被频繁清理,与 autovacuum_vacuum_threshold(改参数默认值为 50,表中至少有 50 条数据发成 dml 操作时,才会触发 vacuum 自动清理) 参数共同作用。
autovacuum_analyze_scale_factor:触发 vacuum 自动 analyze 操作的 dml 比例,默认值 0.1,当表上的 dml 操作占据表数据量的 20% 时触发 vacuum 自动 analyze 操作,为防止数据量较小的表被频繁 analyze,与 autovacuum_analyze_threshold(改参数默认值为 50,表中至少有 50 条数据发成 dml 操作时,才会触发 vacuum 自动 analyze) 参数共同作用。
autovacuum_freeze_max_age:某表的pg_class.relfrozenxid的最大值,如果超出此值则重置xid,默认值为2亿,注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。
autovacuum_multixact_freeze_max_age:某表的pg_class.relminmxid最大值,如果超出此值则重置xid,默认值为4亿,注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。
autovacuum_vacuum_cost_delay:指定用于自动 VACUUM 操作中的代价延迟值,如果指定-1(默认值),则使用 vacuum_cost_delay 值(默认值 2ms)。

补充说明

由于生产环境中每张业务表作用、使用频繁程度、“死元组”的增长速度等都不同,建议结合业务情况,对重要的生产业务表单独进行设置参数值。

  • dml 操作特别频繁的表,做类似如下设置:
    ALTER TABLE mytable SET (autovacuum_vacuum_scale_factor = 0.01);
  • 索引字段,dml 操作特别频繁的表,做类似如下设置:
    ALTER TABLE mytable SET (fillfactor=80);
  • 仅插入数据库表,做类似如下设置:
    ALTER TABLE mytable SET (autovacuum_freeze_max_age = 10000000);