postgresql , 垃圾回收 , 参数 , freeze
哪些参数或因素将影响或控制postgresql的垃圾回收呢?
1、控制vacuum命令的睡眠时间,当vacuum的阶段性cost大于vacuum_cost_limit时,睡眠一段时间后继续。
2、vacuum时,不同数据块(在shared buffer中命中的块、未命中的块、脏块)的成本
3、vacuum阶段性cost阈值
4、对只读事务设置的超时时间,防止long sql带来的膨胀
5、在ckpt后第一次产生或变更的脏块,是否记录整个数据块的内容到wal中。
6、是否开启wal压缩
7、自动垃圾回收相关进程
1、数据库不能回收long sql事务快照后产生的垃圾,也即是说,数据库中最老的事务,决定了数据库可以回收的垃圾上限。在此事务快照后产生的垃圾都无法被回收。
2、snapshot too old,开启这个参数后,只读事务的允许时间超过这个时间后,将自动回滚。防止long sql引起的膨胀。
3、备库开启了hot_standby_feedback = on时,备库如果运行long sql,也会导致主库垃圾回收受限。导致膨胀。同时如果naptime很小,则可能导致频繁的无效vacuum发生,导致数据库的io,cpu飙高。
4、freeze是扫描全表的动作,如果大表发生freeze,可能导致大量的数据文件读写io,以及wal的写io。通过wal日志分析,可以找到freeze的蛛丝马迹。
5、如果主库设置了vacuum_defer_cleanup_age 大于 0 ,可能导致膨胀,同时如果naptime很小,则可能导致频繁的无效vacuum发生,导致数据库的io,cpu飙高。